2013-05-08 11 views
11

Ho una pagina che esegue vari codici javascript, compresa la chiamata setTimeout(). Se un utente fa clic su un link per navigare verso un'altra pagina, a che punto il javascript su questa pagina smette di funzionare e quindi il mio codice chiamato da setTimeout non verrà più chiamato? per esempio.Quando javascript interrompe l'esecuzione su una pagina dopo aver fatto clic su un collegamento?

  • non appena il link viene cliccato (So che questo è sbagliato)
  • quando il browser inizia a ricevere la nuova pagina
  • qualche altro punto?

Ed è diverso per i diversi principali browser?

Sfondo

Voglio sapere questo in gran parte per il bene di interesse, piuttosto che per risolvere qualsiasi problema particolare. Il problema che mi ha spinto a pensarci è che vorrei fare qualcosa quando un utente fa clic su un particolare link in una pagina. Voglio eseguire una chiamata Ajax e elaborare il risultato, ma non sono troppo preoccupato se finisce prima che la pagina venga scaricata. Quindi farò scattare un setTimeout() sul link click e poi se sarò fortunato finirà ma se non lo farò non lo farò. Mi chiedevo in quali circostanze avrebbe funzionato. Mentre ci possono essere altre soluzioni a questo problema, non voglio soluzioni al problema, voglio solo sapere la risposta alla domanda.

+5

Probabilmente subito dopo [evento onunload] (https://developer.mozilla.org/en-US/docs/DOM/window.onunload), ma perché è così importante per te? –

+0

_Che browser? –

+1

I * timer attivi * (a cui "setTimeout" viene aggiunto) vengono cancellati durante il ['scarico dei passaggi di pulizia del documento'] (http://www.w3.org/TR/html5/browsers.html#unloading-document-cleanup -steps), che vengono chiamati (tra gli altri) dalla ['download document procedure'] (http://www.w3.org/TR/html5/browsers.html#unload-a-document).Tuttavia non sono sicuro quando esattamente questi sono chiamati durante un processo di navigazione (http://www.w3.org/TR/html5/browsers.html#navigating-across-documents) – Bergi

risposta

0

Una possibile soluzione sarebbe quella di interrompere l'evento di clic, ignorare una chiamata asincrona e riprendere l'evento predefinito quando il risultato della chiamata ajax è stato elaborato. Oppure, se possibile, potresti gestire l'elaborazione sul server, nel qual caso non avresti nemmeno bisogno di interrompere l'evento di default: basta licenziare la tua chiamata asincrona.

In risposta alla tua domanda, sono d'accordo con Jack sul fatto che lo script si fermerebbe dopo l'evento onunload.

Spero che questo hepls.

3

Ecco la sequenza di ciò che accade:

Fase 1: Si fa clic su un link. Qui il browser invia una richiesta al server e attende la risposta. L'oggetto documento della pagina corrente esiste ancora.

Passaggio 2: il browser riceve la risposta. Gli oggetti documento della pagina corrente esistono ancora.

Passaggio 3: il browser analizza, crea e restituisce la risposta a un nuovo oggetto documento.

Il passaggio 3 è quando il JS della pagina corrente si fermerà, A MENO, è stata scelta la risposta a un iframe, ad esempio. Se lo fai, il nuovo oggetto documento verrà reso all'interno dell'iframe e l'oggetto documento della pagina corrente rimarrà intatto e JS rimarrà comunque funzionale.

Spero che risponda alla tua domanda!

+0

Grazie! Avete qualche riferimento per descrivere in modo più dettagliato? – Rory

+0

Penso che il vecchio DOM sia stato scaricato anche prima che il browser riceva una risposta? Cosa ti fa pensare che questa sia la sequenza, hai qualche riferimento? – Bergi

+0

C'è un modo per rilevare se l'utente è in attesa di un link per rispondere? Es: "Se l'utente non sta cercando di andarsene, fai più lavoro occupato". –

Problemi correlati