Есть ли способ очистить все тайм-ауты из данного окна? Я полагаю, что таймауты хранятся где-то в window
объекте, но не могу это подтвердить.
Приветствуется любое кроссбраузерное решение.
javascript
timeout
Марсио
источник
источник
Ответы:
Их нет в объекте окна, но у них есть идентификаторы, которые (afaik) являются последовательными целыми числами.
Таким образом, вы можете очистить все таймауты следующим образом:
источник
Я думаю, что самый простой способ добиться этого - хранить все
setTimeout
идентификаторы в одном массиве, где вы можете легко выполнять итерациюclearTimeout()
по всем из них.источник
У меня есть дополнение к ответу Pumbaa80, которое может быть полезно для тех, кто разрабатывает старые IE.
Да, все основные браузеры реализуют идентификаторы тайм-аута как последовательные целые числа (что не требуется по спецификации ). Хотя начальный номер отличается от браузера к браузеру. Кажется, что Opera, Safari, Chrome и IE> 8 запускают идентификаторы тайм-аута с 1, браузеры на основе Gecko с 2 и IE <= 8 с некоторого случайного числа, которое волшебным образом сохраняется при обновлении вкладки. Вы можете узнать это сами .
Все это означает, что в IE <= 8
while (lastTimeoutId--)
цикл может выполняться более 8 раз и показывать сообщение « Сценарий на этой странице вызывает медленную работу Internet Explorer ». Поэтому, если вы не можете сохранить все идентификаторы тайм-аута или не хотите переопределять window.setTimeout, вы можете подумать о сохранении первого идентификатора тайм-аута на странице и очистке тайм-аутов до него.Выполнить код при ранней загрузке страницы:
А затем очистите все ожидающие таймауты, которые, вероятно, были установлены иностранным кодом столько раз, сколько захотите.
источник
Как насчет сохранения идентификаторов тайм-аутов в глобальном массиве и определения метода для делегирования вызова функции окну.
источник
Вам нужно переписать
window.setTimeout
метод и сохранить его идентификатор тайм-аута.источник
Чтобы очистить все таймауты, они должны быть сначала «захвачены» :
Поместите приведенный ниже код перед любым другим скриптом, и он создаст функцию-оболочку для исходного
setTimeout
&clearTimeout
.clearTimeouts
Кwindow
объекту будут добавлены новые методы , которые позволят очистить все (ожидающие) таймауты ( ссылка Gist ).источник
Для полноты картины я хотел опубликовать общее решение, охватывающее как
setTimeout
иsetInterval
.Кажется, браузеры могут использовать один и тот же пул идентификаторов для обоих, но из некоторых ответов на вопрос: Являются ли clearTimeout и clearInterval одинаковыми? , неясно, безопасно ли полагаться
clearTimeout
иclearInterval
выполнять одну и ту же функцию или работать только с соответствующими типами таймеров.Поэтому, когда цель состоит в том, чтобы уничтожить все таймауты и интервалы, вот реализация, которая может быть немного более защитной в разных реализациях, когда не может проверить их все:
Вы можете использовать его для очистки всех таймеров в текущем окне:
Или вы можете использовать его для очистки всех таймеров в
iframe
:источник
Я использую Vue с Typescript.
источник
Уже очень поздно ... но:
По сути, идентификаторы setTimeout / setInterval идут в последовательном порядке, поэтому просто создайте фиктивную функцию тайм-аута, чтобы получить наивысший идентификатор, а затем очистите интервал для всех идентификаторов ниже этого.
источник
Используйте глобальный тайм-аут, от которого зависят все ваши другие функции. Это заставит все работать быстрее и упростит управление, хотя добавит некоторую абстракцию в ваш код.
источник
set_timeout
глобальной функции? Не могли бы вы привести пример кода?Мы только что опубликовали пакет, решающий именно эту проблему.
npm install time-events-manager
При этом вы можете просматривать все таймауты и интервалы с помощью
timeoutCollection
&intervalCollection
объектов. Также естьremoveAll
функция, которая очищает все таймауты / интервалы как из коллекции, так и из браузера.источник