2011-02-26 9 views

risposta

27

L'evento onpopstate dovrebbe essere licenziato quando cambia la storia, è possibile associare ad esso nel codice come questo:

window.onpopstate = function (event) { 
    // do stuff here 
} 

Questo evento può anche essere licenziato al caricamento della pagina, è possibile determinare se l'evento è stato sparato da un caricamento della pagina, oppure utilizzando pushState/replaceState controllando l'oggetto evento per una proprietà dello stato, sarà indefinito se l'evento è stato causato da un caricamento della pagina

window.onpopstate = function (event) { 
    if (event.state) { 
    // history changed because of pushState/replaceState 
    } else { 
    // history changed because of a page load 
    } 
} 

attualmente v'è nessun caso onpushstate purtroppo , per aggirare questo è necessario avvolgere entrambi i metodi pushState e replaceState per implementare il proprio evento onpushstate.

Ho una libreria che rende un po 'più semplice il lavoro con pushState, potrebbe valere la pena di verificarlo chiamato Davis.js, fornisce una semplice API per lavorare con il routing basato su pushState.

+0

Sembra che event.state possa ancora essere impostato sul caricamento della pagina (Chrome). – GolezTrol

+2

Mozilla/Firefox non emette un evento onpopstate al caricamento della pagina, ma Safari/Chrome fa – tom

+0

Nel mio caso, questo evento si verifica dopo il successo di una chiamata Ajax. Forse a causa di ciò, non sono in grado di rilevare l'evento per la prima volta. Se faccio clic sul pulsante Indietro/Avanti, allora funziona bene, tuttavia non mi aspetto che il mio utente faccia clic sui pulsanti della cronologia. –

13

ho usato per usare questo per essere avvisato di quando pushState e replaceState sono chiamati:

// Add this: 
var _wr = function(type) { 
    var orig = history[type]; 
    return function() { 
     var rv = orig.apply(this, arguments); 
     var e = new Event(type); 
     e.arguments = arguments; 
     window.dispatchEvent(e); 
     return rv; 
    }; 
}; 
history.pushState = _wr('pushState'), history.replaceState = _wr('replaceState'); 

// Use it like this: 
window.addEventListener('replaceState', function(e) { 
    console.warn('THEY DID IT AGAIN!'); 
}); 

Di solito è eccessivo, però. E potrebbe non funzionare in tutti i browser. (Mi interessa solo la mia versione del mio browser.)

NB. Inoltre non funziona negli script di contenuto di estensioni di Google Chrome, perché non è consentito modificare l'ambiente JS del sito. Puoi ovviare a ciò inserendo un codice <script> con detto codice, ma questo è ancora più eccessivo.

Problemi correlati