¿Puedo actualizar window.location.hash sin tener que desplazar la página web?
-
22-07-2019 - |
Pregunta
Usando JavaScript, ¿hay alguna manera de actualizar window.location.hash sin desplazarse por la página web?
Tengo elementos de título en los que se puede hacer clic 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. Entonces, cuando navegue fuera de / foo # bar, podré usar el botón Atrás y hacer que el div cuyo ID está en window.location.hash esté visible al regresar.
¿Es posible este comportamiento?
Solución
Este comportamiento es muy posible. Debería buscar en algunas de las bibliotecas que se han desarrollado para brindarle esta funcionalidad.
Historia realmente simple: http://code.google.com/p/reallysimplehistory/ SWFAddress: http://www.asual.com/swfaddress/
Otros consejos
Para cambiar el hash sin que la página se vuelva a cargar / desplazar, ahora simplemente puede usar html5 history.pushState
.
history.pushState(null,null,'#hashexample');
Es compatible con todos los principales navegadores:
MDN:
También tenga en cuenta que el último parámetro de url que estamos usando aquí, puede ser cualquier url, por lo que no se limita a hashes.
Tan fácil como sea
var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);
Otra cosa que podría intentar es cambiar la identificación del elemento al que apunta el hash temporalmente. ¡Trabajó para mí!
function changeHashWithoutScrolling(hash) {
var id = hash.replace(/^.*#/, ''),
elem = document.getElementById(id)
elem.id = id+'-tmp'
window.location.hash = hash
elem.id = id
}
Quería agregar un comentario a la respuesta de Catherines pero aún no tengo el representante -
Gran solución, sin embargo, no me funcionaba en Chrome ya que $ ('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);
Basándose en la respuesta de Sunny, hice esta función que también evita indefinidos 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;
}
}
}