2012-03-16 7 views
6

L'evento popState verrà attivato quando l'URL è stato modificato (indietro o avanti). E di recente ho notato che, ad esempio, in http://www.example.com/:Come annullare popState in determinate condizioni

<a href="#anchor">Top</a> 

sarà anche innescare popState, causando la pagina per "ricaricare".
Come posso sapere se è lo stesso url e solo la parte # è stata modificata?

$(window).bind("popstate",function(){ 
    swap(location.href); 
}) 

Nell'esempio, quando si fa clic sul collegamento "Top" (vedi sopra), la pagina andrà a #anchor, ma anche si innescherà popState e provoca il ricaricamento, che è non mi aspetto.

risposta

0

Si potrebbe verificare window.location.hash per vedere che tipo di ancoraggio # viene aggiunto ad esso e prendere l'azione appropriata.

Inoltre, selezionando window.onhashchange è possibile distinguere tra le modifiche complete dell'URL in window.location.href o solo le modifiche di hash.

Esempio:

window.onhashchange = function() 
{ 
    console.log('Hash change:' + window.location.hash); 
} 
+1

Ma come posso combinarlo con 'popState'? –

+0

[MDN] (https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history): '" Si noti che pushState() non causa mai l'attivazione di un evento di hashchange, anche se il nuovo URL differisce dal vecchio URL solo in il suo hash. "" Sembra non funzionare. –

4

non riuscivo a trovare qualsiasi cosa, da l'evento per determinare se che questo era solo un cambiamento di ancoraggio, così ho dovuto tenere traccia di me stesso con il codice come il seguente:

La posizione viene memorizzata senza l'hash, quindi quando il popstate si attiva a causa del clic sul collegamento con l'ancora, il metodo getLocation restituirà lo stesso risultato di prima e il codice per lo scambio della pagina non avverrà.

Per essere sicuri di tenere traccia della posizione corrente correttamente, è inoltre necessario aggiornare la variabile ogni volta che si cambia lo stato con pushState() o replaceState()

Problemi correlati