2009-03-14 16 views
25

Usando JavaScript, ¿hay alguna manera de actualizar window.location.hash sin desplazarse por la página web?¿Puedo actualizar window.location.hash sin tener que desplazar la página web?

Tengo elementos de título seleccionables que alternan la visibilidad de un div directamente debajo de ellos. Quiero la barra/foo # en el historial al hacer clic en los títulos, pero no quiero que la página se desplace. Por lo tanto, cuando navegue desde/foo # bar, podré usar el botón Atrás y tener el div cuyo ID esté en window.location.hash visible a su regreso.

¿Este comportamiento es posible?

+0

Ver [esta pregunta stackOverflow] (http:// stackoverf low.com/questions/568719/is-monitoring-location-hash-a-solution-for-history-in-xhr-apps) y/o [esta página] (http://www.nicon.nl/hash2history/) donde presento un script básico para abordar el problema. – KooiInc

+0

Gracias. Revisé esa pregunta y tu script personalizado. –

Respuesta

1

Este comportamiento es muy posible. Debería buscar en algunas de las bibliotecas que se han desarrollado para darle esta funcionalidad.

historia realmente simple: http://code.google.com/p/reallysimplehistory/ SWFAddress: http://www.asual.com/swfaddress/

+0

Genial. Esos se ven bien a excepción de la documentación existente para RSH. Creo que SWFAddress parece ser la mejor opción por ahora. –

+0

De hecho. Siento que hay una falta de documentación de RSH. Yo uso SWFAddress y hasta ahora ha funcionado bien. – Willem

+1

Esto es muy excesivo para una tarea tan simple. Algunas líneas de código son MUCHO más preferibles que agregar nuevas bibliotecas y dependencias. – Kehlan

22

Otra cosa que podría intentar es cambiar el id del elemento hash de los puntos de forma temporal. ¡Trabajó para mi!

function changeHashWithoutScrolling(hash) { 
    var id = hash.replace(/^.*#/, ''), 
     elem = document.getElementById(id) 
    elem.id = id+'-tmp' 
    window.location.hash = hash 
    elem.id = id 
} 
+0

Esto es asombroso. Funciona genial. – samg

+0

Creo que quiere decir 'document.getElementById (id);' – AlienWebguy

+0

Gracias @AlienWebguy, corrigió la función en el comentario. – Sunny

30

Tan fácil como llegar

var scrollmem = $('html,body').scrollTop(); 
window.location.hash = hash; 
$('html,body').scrollTop(scrollmem); 
+0

Esto funciona genial, gracias! – Sam

+0

¡Muy resbaladizo, gracias! – VictorKilo

+2

Creo que la primera línea debería ser "var scrollmem = $ ('html, body'). ScrollTop();" para que coincida con el tercero. De lo contrario, no funciona para mí en Firefox. – Anthony

26

Para cambiar el hash sin tener la página de recarga/desplazamiento, puede ahora simplemente utilizar HTML5 history.pushState.

history.pushState(null,null,'#hashexample'); 

Está apoyado por todos los principales navegadores:

http://caniuse.com/history

MDN:

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#The_pushState().C2.A0method

También tenga en cuenta que el último parámetro url que estamos utilizando aquí, podemos ser cualquier url, por lo que no está limitado a hashes.

+3

Oh, me gustaría poder abrazarte. – Magicode

+4

'replaceState' es probablemente la mejor manera de hacerlo aquí. La diferencia es que 'pushState' agrega un elemento a su historial, mientras que' replaceState' no. –

2

quería añadir un comentario a la respuesta Catherines, pero no tengo el representante todavía -.

gran solución sin embargo, no estaba trabajando para mí en Chrome como $ ('html') scrollTop() siempre devuelve 0 - una edición menor resuelve el problema:

scrollmem = $('html').scrollTop() || $('body').scrollTop(); 
window.location.hash = hash; 
$('html,body').scrollTop(scrollmem); 
1

Bas en la respuesta de Sunny hice esta función que también evita indefinido y nulos:

function changeHashWithoutScrolling(hash) { 
     var id; 
     var elem; 

     id = hash.replace(/^.*#/, ''); 

     if (id) { 
      elem = document.getElementById(id); 

      if (elem) { 
       elem.id = id + '-tmp'; 
       window.location.hash = hash; 
       elem.id = id; 
      } 
     } 
    } 
Cuestiones relacionadas