2012-05-02 14 views
6

Il mio Google-fu non tira fuori nulla.Esiste una richiamata per History.pushstate?

Quando si esegue questa operazione:

var stateObj = { state: "some state" }; 
history.pushState(stateObj, "page 2", "other.htm"); 

C'è una finestra di callback associato?

so che c'è questo:

window.onpopstate = function() { 

} 

Quali grandi opere per l'ascolto di quando un utente preme il pulsante indietro. Tuttavia, voglio ascoltare ogni volta che l'URL cambia, e non sono sicuro di come farlo.

Esiste una richiamata globale per qualsiasi momento in cui l'URL cambia?

+0

http://stackoverflow.com/questions/680785/on-window-location-hash-change – Joe

+0

Provare a collegarlo a un elemento e quindi controllare è typeof value (typeof elem.onpopstate), se non è definito non è supportato , se è una funzione tutta buona. http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ per informazioni su come – GillesC

+2

possibile duplicato di [Come ricevere notifiche sulle modifiche della cronologia tramite history.pushState?] (http: // stackoverflow. it/questions/4570093/how-to-get-notify-about-changes-of-the-history-via-history-pushstate) – thekevinscott

risposta

12

No, non c'è uno onpushstate o qualsiasi altra cosa. Tuttavia, una piccola patch per le scimmie può risolvere il problema:

var pushState = history.pushState; 
history.pushState = function() { 
    pushState.apply(history, arguments); 
    fireEvents('pushState', arguments); // Some event-handling function 
}; 

Questo verrà notificato solo quando viene utilizzato pushState. Probabilmente vorresti fare qualcosa di simile per replaceState.

Se è necessario ricevere una notifica ogni volta che l'URL cambia, alcune combinazioni del gestore sopra e di un gestore di hashchange vi porteranno la maggior parte del modo.

+1

Cosa sai, [questo] (http://stackoverflow.com/questions/4570093/how- to-get-notify-about-changes-of-the-history-via-history-pushstate) la domanda è quasi identica, così come la risposta. : P –

+0

Questo ti può mettere nei guai? Per esempio. facendo questo su un sito Web di terze parti in cui si carica uno script. O è per lo più sicuro? – Cristian

+0

Ho trovato un esempio in cui questo potrebbe non funzionare. Ad esempio in Backbone.history, il riferimento 'history.pushState' viene copiato in' Backbone.history.pushState'. Se sostituiamo il riferimento per 'window.history.pushState' usando' = 'assignment allora avrai ancora' Backbone.history.pushState' che fa riferimento al vecchio 'pushState', quindi il tuo codice patch scimmia non viene chiamato. Se solo JS avesse una gestione di riferimento integrata :( – Cristian

Problemi correlati