Gibt es eine Möglichkeit, alle Zeitüberschreitungen in einem bestimmten Fenster zu löschen? Ich nehme an, die Zeitüberschreitungen sind irgendwo im window
Objekt gespeichert , konnten dies aber nicht bestätigen.
Jede Cross-Browser-Lösung ist willkommen.
javascript
timeout
Marcio
quelle
quelle
Antworten:
Sie befinden sich nicht im Fensterobjekt, aber sie haben IDs, die (afaik) aufeinanderfolgende ganze Zahlen sind.
So können Sie alle Zeitüberschreitungen wie folgt löschen:
quelle
Ich denke, der einfachste Weg, dies zu erreichen, besteht darin, alle
setTimeout
Bezeichner in einem Array zu speichern , zu dem SieclearTimeout()
auf allen leicht iterieren können.quelle
Ich habe eine Ergänzung zu Pumbaa80s Antwort , die für jemanden nützlich sein könnte, der sich für alte IEs entwickelt.
Ja, alle gängigen Browser implementieren Timeout-IDs als aufeinanderfolgende Ganzzahlen (was in der Spezifikation nicht erforderlich ist ). Obwohl die Startnummer von Browser zu Browser unterschiedlich ist. Es scheint, dass Opera, Safari, Chrome und IE> 8 Timeout-IDs von 1, Gecko-basierte Browser von 2 und IE <= 8 von einer Zufallszahl aus starten, die bei der Aktualisierung von Registerkarten auf magische Weise gespeichert wird. Sie können es selbst entdecken .
Alles, was bedeutet, dass der
while (lastTimeoutId--)
Zyklus in IE <= 8 mehr als 8 -stellig ausgeführt werden kann und die Meldung " Ein Skript auf dieser Seite bewirkt, dass Internet Explorer langsam ausgeführt wird " angezeigt wird. Wenn Sie also nicht alle Timeout- IDs speichern können oder window.setTimeout nicht überschreiben möchten , können Sie die erste Timeout-ID auf einer Seite speichern und Timeouts bis dahin löschen .Führen Sie den Code beim frühen Laden der Seite aus:
Und löschen Sie dann alle ausstehenden Zeitüberschreitungen, die wahrscheinlich so oft durch Fremdcode festgelegt wurden, wie Sie möchten
quelle
Wie wäre es, wenn Sie die Timeout-IDs in einem globalen Array speichern und eine Methode definieren, um den Funktionsaufruf an die Fenster zu delegieren.
quelle
Sie müssen die
window.setTimeout
Methode neu schreiben und ihre Timeout-ID speichern.quelle
Um alle zu löschen Timeouts sie müssen „eingefangen“ werden zuerst :
Platzieren Sie den folgenden Code vor jedem anderen Skript und es wird eine Wrapper-Funktion für das Original
setTimeout
& erstelltclearTimeout
.Dem Objekt werden neue
clearTimeouts
Methoden hinzugefügtwindow
, mit denen alle (ausstehenden) Zeitüberschreitungen gelöscht werden können ( Link Link ).quelle
Der Vollständigkeit halber wollte ich eine allgemeine Lösung veröffentlichen, die sowohl
setTimeout
als auch abdecktsetInterval
.Es scheint, dass Browser für beide denselben ID-Pool verwenden, aber aus einigen Antworten auf Sind clearTimeout und clearInterval gleich? Es ist nicht klar, ob es sicher ist, sich auf dieselbe Funktion zu verlassen
clearTimeout
undclearInterval
sie auszuführen oder nur an ihren jeweiligen Timertypen zu arbeiten.Wenn das Ziel darin besteht, alle Zeitüberschreitungen und Intervalle zu beenden, finden Sie hier eine Implementierung, die bei Implementierungen möglicherweise etwas defensiver ist, wenn nicht alle getestet werden können:
Sie können damit alle Timer im aktuellen Fenster löschen:
Oder Sie können es verwenden, um alle Timer in einem
iframe
:quelle
Ich benutze Vue mit Typescript.
quelle
Verwenden Sie ein globales Timeout, von dem alle anderen Funktionen das Timing ableiten. Dadurch wird alles schneller ausgeführt und einfacher zu verwalten, obwohl Ihr Code dadurch etwas abstrahiert wird.
quelle
set_timeout
globalen Funktion erweitern? Könnten Sie einen Beispielcode geben?Wir haben gerade ein Paket veröffentlicht, das genau dieses Problem löst.
npm install time-events-manager
Damit können Sie alle Timeouts und Intervalle über
timeoutCollection
&intervalCollection
Objekte anzeigen . Es gibt auch eineremoveAll
Funktion, die alle Zeitüberschreitungen / Intervalle sowohl aus der Sammlung als auch aus dem Browser löscht.quelle