2010-11-05 16 views
44

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; 
} 
+4

una bella, semplice soluzione, si dovrebbe fare una risposta – Peter

+1

Il l'unica cosa rimasta è controllare che il nuovo hash non sia uguale al vecchio prima di impostare _ignoreHashChange = true; – Kasheftin

+1

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

risposta

5

Si può avere una funzione come questa:

function updateHash(newHash){ 
    ... 
    oldHash = newHash 
} 

poi nel vostro setTimeOut è necessario fare

function(){ 
    if(oldHash != currenHash){ 
    updateHash(currenHash); 
    } 
} 

Così ora è possibile chiamare aggiornamento hash manualmente e non verrà attivato dall'evento. Puoi anche avere più parametri in updateHash per fare altre cose.

A proposito, hai guardato il plug-in della cronologia jQuery? http://tkyk.github.com/jquery-history-plugin/

+0

Dovrebbe essere un intervallo impostato, ma sì, in linea di principio questo funzionerebbe. Grazie. – SystemicPlural

+1

Sì, ho visto diversi plugin. Sono tutti troppo gonfiati o infestati per i miei bisogni. – SystemicPlural

+0

Mi hai suggerito una soluzione migliore che non richiede un timeout. vedere la modifica nel mio post principale per i dettagli. Grazie per il tuo aiuto, – SystemicPlural

5

Si potrebbe utilizzare history.replaceState e aggiungere l'hash, per sostituire l'attuale URI senza attivare l'evento hashchange:

var newHash = 'test'; 

history.replaceState(null, null, document.location.pathname + '#' + newHash); 

JSFiddle example

+0

'history.replaceState' NON sposta la hashchange nella cronologia, ma se vuoi, puoi usare la cronologia'.pushState';) – qdev

+0

@qdev Sì, ma non era quello che il QA chiedeva ... – Tim

Problemi correlati