Estoy usando hash para cargar contenido dinámicamente. Para hacer que el botón Atrás funcione, estoy capturando cambios hash. Sin embargo, algunas veces necesito cambiar el hash sin activar la función hash changed (por ejemplo, cuando la página fue redirigida al servidor y necesito actualizar el hash una vez que el contenido ha regresado).Cambiar hash sin activar un evento hashchange
La mejor solución que he encontrado es desvincular el evento hashchange, hacer el cambio y luego volver a vincularlo. Sin embargo, como esto ocurre de forma asíncrona, estoy descubriendo que se vuelve a enlazar demasiado rápido y todavía capta el cambio de hash.
Mi solución en este momento es muy pobre: volver a vincular en un setTimeout. ¿Alguien tiene una idea mejor?
$(window).unbind('hashchange', hashChanged);
window.location.hash = "!" + url;
setTimeout(function(){
$(window).bind('hashchange', hashChanged);
}, 100);
Editar: sugerencia
de Amir Raminfar me llevó a una solución que no requiere un tiempo de espera. He añadido una variable de clase
_ignoreHashChange = false;
Cuando quiero cambiar el hash en silencio hago esto:
_ignoreHashChange = true;
window.location.hash = "!" + url;
y el hash cambiado evento hace esto:
function hashChanged(event){
if(_ignoreHashChange === false){
url = window.location.hash.slice(2);
fetchContent(url);
}
_ignoreHashChange = false;
}
una solución simple y agradable, usted debe hacer una respuesta – Peter
El lo único que queda es comprobar que el nuevo hash no es igual al anterior antes de configurar _ignoreHashChange = true; – Kasheftin
Es posible que desee consultar la biblioteca Cowboy's BBQ que le proporciona un control preciso sobre todas las cosas Back y Hashchange: http://benalman.com/code/projects/jquery-bbq/docs/files/jquery-ba-bbq-js. html – hybernaut