2010-03-29 8 views
31

Durante la scrittura del codice lato server è necessario interrompere esplicitamente l'esecuzione dopo aver inviato un'intestazione "Posizione: ..." al client o il codice continuerà ad essere eseguito in background.La modifica di window.location interrompe l'esecuzione di javascript?

Ma cosa succede quando si modifica window.location in uno script sul lato client? Ciò interrompe immediatamente l'esecuzione dello script corrente o spetta al programmatore assicurarsi che non venga raggiunto alcun codice situato dopo questa chiamata?

+0

+1 per la domanda interessante –

+0

@DavidAndersson Che altro implica il tuo +1? – stolsvik

+0

@stolsvik quasi tutto, incluso è utile, mostra uno sforzo di ricerca ed è chiaro. Forse vale anche la pena leggerlo, divertente, intrigante, ecc.? – Andrew

risposta

11

L'impostazione window.location non interrompe implicitamente l'esecuzione di JS. Prendi il seguente esempio:

function locationTest() { 
    window.location = 'http://www.google.com/'; 
    window.open('http://www.yahoo.com/'); 
} 

locationTest(); 

Provare a eseguire quello da Firebug/Web Inspector/ecc. e noterai che la finestra corrente caricherà Google, ma una nuova finestra si aprirà anche con Yahoo.

+0

Questa potrebbe essere una condizione di gara. Posso immaginare che i vecchi script smettono di essere eseguiti quando la nuova posizione ha completato il caricamento – codymanix

+0

Su Safari sembra che interrompa l'esecuzione dopo window.location –

15

Questo arrestare immediatamente l'esecuzione dello script corrente

No, lo script gestore restante verrà eseguito alla fine prima di controllo restituisce al browser e gli eventi cominciano ad accadere. Quando il caricamento della nuova pagina diventa sufficientemente lungo per consentire la "navigazione", gli eventi beforeunload e unload verranno attivati, quindi la pagina e qualsiasi script in essa contenuto diventerà inattiva.

Tuttavia, eventuali eventi e timeout in coda potrebbero non attivarsi. Ad esempio, se si sposta la pagina in un gestore click di un pulsante di invio modulo e non si annulla l'azione predefinita, è possibile (condizione di competizione) che la navigazione si verifichi prima dell'evento submit in coda con l'azione predefinita dello click.

+4

Grazie. Come corollario a questa domanda, esiste un modo per rilevare quando ci si trova in questo stato (ad esempio, 'window.location' è cambiato ma la navigazione non è ancora avvenuta)? – speedplane

+0

Grazie, solo la risposta di cui avevo bisogno. La tua risposta si basa sull'osservazione di come funzionano i browser, o questo comportamento è definito da qualche parte? –

+0

La risposta era basata sull'osservazione, ma alcuni lavori sono stati eseguiti in HTML5 sulla standardizzazione del flusso di controllo del browser, ad esempio https://www.w3.org/TR/html5/webappapis.html#event-loops, https: // www.w3.org/TR/html5/browsers.html#navigate. Gli standard con cui siamo finiti sono in gran parte illeggibili e lasciano ancora un mucchio di cose non specificate, ma siamo ancora in una situazione migliore di quella incoerente e misteriosa che avevamo prima. – bobince

Problemi correlati