Sto utilizzando l'hash per caricare il contenuto in modo dinamico. Per far funzionare il pulsante Indietro sto acquisendo le modifiche dell'hash. Tuttavia a volte ho bisogno di cambiare l'hash senza attivare la funzione hash modificata (ad esempio, quando la pagina è stata reindirizzata lato server e devo aggiornare l'hash una volta che il contenuto è tornato.)Modifica hash senza attivazione di un evento hashchange
La soluzione migliore che ho trovato è quello di disassociare l'evento hashchange, apportare la modifica e quindi rebindarla. Tuttavia, poiché ciò avviene in modo asincrono, sto riscontrando che si ricollega troppo rapidamente e continua a rilevare il cambio di hash.
La mia soluzione al momento è molto scarsa: riavvolgimento in un setTimeout. Qualcuno ha un'idea migliore?
$(window).unbind('hashchange', hashChanged);
window.location.hash = "!" + url;
setTimeout(function(){
$(window).bind('hashchange', hashChanged);
}, 100);
Edit: suggerimento di
Amir Raminfar mi ha spinto a una soluzione che non richiede un timeout. ho aggiunto una classe variabile
_ignoreHashChange = false;
Quando voglio cambiare l'hash silenziosamente faccio questo:
_ignoreHashChange = true;
window.location.hash = "!" + url;
e l'hash cambiato evento fa questo:
function hashChanged(event){
if(_ignoreHashChange === false){
url = window.location.hash.slice(2);
fetchContent(url);
}
_ignoreHashChange = false;
}
una bella, semplice soluzione, si dovrebbe fare una risposta – Peter
Il l'unica cosa rimasta è controllare che il nuovo hash non sia uguale al vecchio prima di impostare _ignoreHashChange = true; – Kasheftin
Si potrebbe voler controllare la libreria BBQ di Cowboy che ti dà un controllo eccellente su tutte le cose Back and Hashchange: http://benalman.com/code/projects/jquery-bbq/docs/files/jquery-ba-bbq-js. html – hybernaut