2009-12-13 18 views
23

Sto costruendo una sezione di commenti automatici di aggiornamento per il mio sito web usando jQuery .load. Quindi sto usando un timer 'setTimeout' di javascript per verificare la presenza di nuovi commenti.C'è un modo per cancellare tutti i timer JavaScript contemporaneamente?

Ma dopo aver fatto alcune cose come modificare le pagine di commenti o eliminare (tutte usando ajax), alcuni vecchi timer continuano a funzionare, anche se ho usato clearTimeout prima di caricare un nuovo contenuto Ajax.

C'è un modo per cancellare TUTTI i timer javascript quando carico nuovi contenuti Ajax?

risposta

23

Non esiste una funzione generale in javascript che consente di cancellare tutti i timer. Dovrai tenere traccia di tutti i timer che crei. Per questo è possibile utilizzare una matrice globale:

var timers = []; 
... 
// add a timer to the array 
timers.push(setTimeout(someFunc, 1000)); 
... 
// clear all timers in the array 
for (var i = 0; i < timers.length; i++) 
{ 
    clearTimeout(timers[i]); 
} 
+0

Il problema è che il mio nuovo contenuto caricato ajax non ha alcun controllo sui vecchi timer in esecuzione. – Jens

+0

Ecco perché ho suggerito una variabile globale. –

+0

grazie, per me anche la tua risposta ha aiutato – beginner

2

Si potrebbe prendere in considerazione l'utilizzo di jQuery Timers, che astrae molti dei "brutti" dettagli di setTimeout/setInterval e li rende più facili da utilizzare nel codice per cose come quello che si sta descrivendo.

+2

link obsoleto – Benubird

+0

@Benubird - Purtroppo questa è la più recente riesco a trovare. Se ne hai una nuova, faccelo sapere ... –

+0

Sì, sembra che non ci sia la versione attuale (http://stackoverflow.com/questions/3674566/where-can-i-download-jquery-timers), potrebbe non essere più utilizzabile – Benubird

39

Attenzione: Il mio codice soffietto è problematico, soprattutto perché il requisito è di per sé problematico. Mi chiedo perché vorresti il ​​svuotare tutti i timer in qualsiasi modo. Questo rende il tuo codice in grado di interrompere qualsiasi plugin che utilizza i timer. Il che è molto più comune di quanto si possa pensare, a meno che, ovviamente, non si stia eseguendo il debug o ci si diverta, quindi non importa.


Se è necessario:

Questo è uno dei peggiori possibili soluzioni. Tuttavia rivela una potenziale vulnerabilità di sicurezza in JavaScript stesso. Ma dal momento che funziona solo (cancella tutti i temporizzatori) ho pensato che sarebbe stato bello condividerlo:

var maxId = setTimeout(function(){}, 0); 

for(var i=0; i < maxId; i+=1) { 
    clearTimeout(i); 
} 
+4

Mentre la risposta accettata è una bella best practice, risponde alla domanda posta nel titolo. –

+0

Bella idea, grazie! – HATCHA

+0

Questa è un'ottima soluzione! Immagino che sia cross-browser comunque? – 0xC0DEGURU

Problemi correlati