Подтвердить что ты не робот

Есть ли способ сразу удалить все таймеры JavaScript?

Я создаю автоматическую секцию комментариев для моего сайта, используя jQuery.load. Поэтому я использую таймер "setTimeout" javascript для проверки новых комментариев.

Но после выполнения некоторых действий, таких как изменение страниц комментариев или удаление (все с использованием ajax), несколько старых таймеров продолжают работать, хотя я использовал clearTimeout перед загрузкой нового содержимого ajax.

Есть ли способ очистить ВСЕ таймеры javascript при загрузке нового содержимого ajax?

4b9b3361

Ответ 1

В javascript нет общей функции, которая позволяет вам очищать все таймеры. Вам нужно будет отслеживать все созданные вами таймеры. Для этого вы можете использовать глобальный массив:

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]);
}

Ответ 2

Предупреждение: Мой код ниже проблематичен, главным образом потому, что это требование само по себе является проблематичным. Интересно, почему вы хотите очистить все таймеры. Это заставляет ваш код нарушать любой плагин, используя таймеры. Что гораздо чаще, чем вы думаете, если, конечно, вы не отлаживаете или не веселитесь, тогда это не имеет значения.


Если вы должны:

Это одно из худших возможных решений. Однако он обнаруживает потенциальную уязвимость безопасности в самом JavaScript. Но поскольку он просто работает (очищает ВСЕ таймеры), я думал, что было бы здорово поделиться им:

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

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

Ответ 3

Вместо этого вы можете использовать jQuery Timers, который абстрагирует многие "уродливые" детали setTimeout/setInterval и делает их проще использовать в вашем коде для таких вещей, как то, что вы описываете.