Czy istnieje sposób na wyczyszczenie wszystkich limitów czasu z danego okna? Przypuszczam, że limity czasu są przechowywane gdzieś w window
obiekcie, ale nie mogłem tego potwierdzić.
Mile widziane są dowolne rozwiązania dla różnych przeglądarek.
javascript
timeout
marcio
źródło
źródło
Odpowiedzi:
Nie ma ich w obiekcie window, ale mają identyfikatory, które (afaik) są kolejnymi liczbami całkowitymi.
Możesz więc wyczyścić wszystkie limity czasu w następujący sposób:
źródło
Myślę, że najłatwiejszym sposobem na osiągnięcie tego byłoby przechowywanie wszystkich
setTimeout
identyfikatorów w jednej tablicy, w której można łatwo iterowaćclearTimeout()
na nich wszystkich.źródło
Mam dodatek do odpowiedzi Pumba80, który może być przydatny dla kogoś, kto tworzy dla starych IE.
Tak, wszystkie główne przeglądarki implementują identyfikatory limitów czasu jako kolejne liczby całkowite (co nie jest wymagane przez specyfikację ). Chociaż numer początkowy różni się od przeglądarki do przeglądarki. Wygląda na to, że Opera, Safari, Chrome i IE> 8 uruchamia identyfikatory limitów czasu z 1, przeglądarki oparte na Gecko z 2 i IE <= 8 z jakiejś losowej liczby, która jest magicznie zapisywana podczas odświeżania karty. Możesz sam to odkryć .
Wszystko to oznacza, że w IE <= 8
while (lastTimeoutId--)
cykl może trwać ponad 8 cyfr razy i wyświetlać komunikat „ Skrypt na tej stronie powoduje powolne działanie przeglądarki Internet Explorer ”. Więc jeśli nie możesz zapisać wszystkich swoich timeout id lub nie chcesz nadpisywać window.setTimeout , możesz rozważyć zapisanie pierwszego timeout id na stronie i wyczyszczenie timeoutów do tego czasu.Wykonaj kod przy wczesnym ładowaniu strony:
A następnie wyczyść wszystkie oczekujące limity czasu, które prawdopodobnie zostały ustawione przez obcy kod tyle razy, ile chcesz
źródło
Co powiesz na przechowywanie identyfikatorów limitów czasu w tablicy globalnej i zdefiniowanie metody delegowania wywołania funkcji do okna.
źródło
Musisz przepisać
window.setTimeout
metodę i zapisać jej identyfikator limitu czasu.źródło
Aby usunąć wszystkie limity czasu muszą zostać „przechwycone” pierwszy :
Umieść poniższy kod przed jakimkolwiek innym skryptem, a utworzy on funkcję opakowującą dla oryginalnego
setTimeout
&clearTimeout
.clearTimeouts
Dowindow
obiektu zostaną dodane nowe metody , które pozwolą na wyczyszczenie wszystkich (oczekujących) limitów czasu ( łącze Gist ).źródło
Dla kompletności chciałem zamieścić ogólne rozwiązanie, które obejmuje zarówno
setTimeout
isetInterval
.Wygląda na to, że przeglądarki mogą używać tej samej puli identyfikatorów w obu przypadkach, ale z niektórych odpowiedzi na pytanie Czy clearTimeout i clearInterval są takie same? , nie jest jasne, czy można bezpiecznie polegać
clearTimeout
iclearInterval
wykonywać tę samą funkcję, czy też pracować tylko na odpowiednich typach timerów.Dlatego, gdy celem jest zabicie wszystkich limitów czasu i interwałów, oto implementacja, która może być nieco bardziej defensywna we wszystkich implementacjach, gdy nie można przetestować ich wszystkich:
Możesz go użyć do wyczyszczenia wszystkich timerów w bieżącym oknie:
Lub możesz go użyć do wyczyszczenia wszystkich timerów w
iframe
:źródło
Używam Vue z Typescriptem.
źródło
Użyj globalnego limitu czasu, z którego pochodzą wszystkie inne funkcje. Dzięki temu wszystko będzie działać szybciej i będzie łatwiejsze w zarządzaniu, chociaż doda trochę abstrakcji do twojego kodu.
źródło
set_timeout
funkcji globalnej? Czy mógłbyś podać przykładowy kod?Właśnie opublikowaliśmy pakiet rozwiązujący dokładnie ten problem.
npm install time-events-manager
Dzięki temu możesz przeglądać wszystkie limity czasu i interwały za pośrednictwem
timeoutCollection
&intervalCollection
obiektów. Istnieje równieżremoveAll
funkcja, która usuwa wszystkie limity czasu / interwały zarówno z kolekcji, jak i przeglądarki.źródło
Jest już bardzo późno ... ale:
Zasadniczo identyfikatory setTimeout / setInterval idą w kolejności, więc po prostu utwórz fikcyjną funkcję limitu czasu, aby uzyskać najwyższy identyfikator, a następnie wyczyść interwał dla wszystkich identyfikatorów niższych od tego.
źródło