2013-08-25 10 views
5

Desidero aggiungere un listener all'evento "prima dell'URL change", con accesso al vecchio URL. window.onbeforeunload non si attiva se la pagina non viene ricaricata (pagine con AJAX).Rileva modifiche URL (senza scarico finestra)

Questo succede sulle pagine dei video di YouTube, quando si fa clic su un altro video nella colonna di navigazione destra, ad esempio.

Ho letto this post, che i sondaggi window.location. Ma questo non cattura il vecchio URL.

Questo è per un'estensione di Chrome. Sto cercando un modo per rilevare prima della modifica dell'URL in javascript.

+1

Dare la [Storia API] (https://developer.mozilla.org/en-US/docs/Web/API/window.history) un colpo. – Joseph

+0

prova a cercare la memoria locale –

+0

Probabilmente stai cercando l'evento 'beforeunload' abbinato all'API History –

risposta

2

Se stai scrivendo un'estensione di Chrome, puoi ascoltare l'evento onUpdated che viene generato quando viene modificato un URL di tabulazione. Maggiori informazioni qui https://developer.chrome.com/extensions/tabs.html#event-onUpdated.

+0

Sono a conoscenza della scheda UpUpdate. Tuttavia, è possibile rilevare solo con lo script di background, quando l'url viene aggiornato. Sto cercando un modo per rilevare in script di contenuto, pur avendo ancora accesso al vecchio URL. –

+2

Quindi puoi usare il metodo di polling 'window.location' come menzionato nella tua domanda. Per accedere al vecchio URL, salvalo come variabile globale o salvalo su localStorage. YouTube utilizza l'API di cronologia, quindi non ricaricherà lo script di contenuto durante la navigazione su un altro video. –

+1

Sorpreso che non c'è un modo più semplice per farlo .. –

4

Per le pagine basate su AJAX che utilizzano l'API history (la maggior parte di esse, incluso YouTube), è possibile unire history.pushState.

Per Chrome, l'url precedente sarà nella proprietà spf-referer. (Inoltre, la location.href sarà ancora essere impostato per il vecchio URL mentre pushState è sparare, anche.)

Quindi il codice come questo funzionerà:

var H    = window.history; 
var oldPushState = H.pushState; 
H.pushState   = function (state) { 
    if (typeof H.onpushstate == "function") { 
     H.onpushstate ({state: state}); 
    } 
    return oldPushState.apply (H, arguments); 
} 
window.onpopstate = history.onpushstate = function (evt) { 
    console.log ("Old URL: ", evt.state["spf-referer"]); 
} 

Si noti che, perché è necessario ignorare la pagina di destinazione Funzione pushState, è necessario inject questo codice dallo script di contenuto.

Problemi correlati