2009-12-13 11 views
23

Ich erstelle einen automatischen Kommentarbereich für meine Website mit jQuery .load. Also verwende ich einen Javascript 'setTimeout' Timer, um nach neuen Kommentaren zu suchen.Gibt es eine Möglichkeit, alle JavaScript-Timer gleichzeitig zu löschen?

Aber nachdem ich einige Dinge getan habe, wie das Ändern von Kommentarseiten oder Löschen (alles mit Ajax), laufen ein paar alte Timer weiter, obwohl ich ClearTimeout benutzt habe, bevor ich neue Ajax-Inhalte geladen habe.

Gibt es eine Möglichkeit, alle Javascript-Timer zu löschen, wenn ich neue Ajax-Inhalte lade?

Antwort

23

Es gibt keine allgemeine Funktion in Javascript, mit der Sie alle Timer löschen können. Sie müssen alle von Ihnen erstellten Timer im Auge behalten. Dazu könnten Sie ein globales Array nutzen:

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

Das Problem ist, dass mein neuerer geladener Ajax-Inhalt keine Kontrolle über die alten laufenden Timer hat. – Jens

+0

Deshalb habe ich eine globale Variable vorgeschlagen. –

+0

danke, für mich hat auch deine Antwort geholfen – beginner

2

Sie können stattdessen die Verwendung von jQuery Timers in Erwägung ziehen, was viele der "hässlichen" Details von setTimeout/setInterval abstrahiert und die Verwendung in Ihrem Code für Dinge wie das, was Sie beschreiben, erleichtert.

+2

Link zu veralten – Benubird

+0

@Benubird - Leider ist das die jüngste ich finden kann. Wenn Sie einen neueren haben, lassen Sie es mich bitte wissen ... –

+0

Ja, sieht so aus als gäbe es keine aktuelle Version (http://stackoverflow.com/questions/3674566/where-can-i-download-jquery-timers), könnte nicht mehr verwendbar sein. – Benubird

39

Warnung: Mein Code unten ist problematisch, vor allem, weil die Forderung selbst problematisch ist. Ich frage mich, warum möchten Sie löschen alle Timer jeder Weg. Dies macht Ihren Code bricht jedes Plugin verwendet die Timer. Was viel häufiger ist, als du vielleicht denkst, es sei denn natürlich, du machst Fehler oder hast Spaß, dann ist es egal.


Wenn Sie müssen:

Dies ist eines der schlimmsten möglichen Lösungen. Es zeigt jedoch eine potenzielle Sicherheitslücke in JavaScript selbst. Aber da es funktioniert einfach (alle Zeiten löscht) dachte ich, es wäre cool, es zu teilen:

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

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

Während die angenommene Antwort eine coole Best-Practice ist, beantwortet dies die Frage im Titel. –

+0

Schöne Idee, danke! – HATCHA

+0

Dies ist eine großartige Lösung! Ich denke, es ist sowieso Browser-übergreifend? – 0xC0DEGURU

Verwandte Themen