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

Как отключить все события setTimeout?

Я использую ajax и asp.net. У меня есть функция javascript, которая создает множество других функций javascript с помощью setTimeout. После асинхронной обратной передачи я хочу отключить все эти события setTimeouted. Как я могу это сделать?

4b9b3361

Ответ 1

Когда вы вызываете setTimeout(), храните идентификатор таймера, чтобы вы могли его очистить. Если вы создаете много тайм-аутов, тогда массив является хорошим вариантом для хранения идентификаторов. Например:

var timeouts = [];
//then, store when you create them
timeouts.push( setTimeout( { ... }, 1000) );

Затем, когда вы хотите очистить их:

for (var i = 0; i < timeouts.length; i++) {
    clearTimeout(timeouts[i]);
}
//quick reset of the timer array you just cleared
timeouts = [];

Как @Robert, отмеченный ниже, clearTimeout() не будет бросать если тайм-аут уже произошел, поэтому здесь нет проблем с расписанием/синхронизацией.

Ответ 2

Если вы не можете получить доступ к коду, где установлен таймер, ответ Nick может не работать, поэтому все, что я могу придумать, это взломать.

Это взломать, используйте с осторожностью!

// Set a fake timeout to get the highest timeout id
var highestTimeoutId = setTimeout(";");
for (var i = 0 ; i < highestTimeoutId ; i++) {
    clearTimeout(i); 
}

В основном он захватывает самый высокий идентификатор таймера и очищает все, что меньше. Но также можно очистить другие таймеры, которые вы не хотите очищать!

Ответ 3

Не уверен, что вы можете сделать это глобально, но наиболее распространенным методом является использование clearTimeout. Вы передаете возвращаемое значение setTimeout() в clearTimeout(), вы можете использовать глобальный var для хранения всех тайм-аутов.

Ответ 4

Во-первых, я использовал этот код:

var x = setTimeout('');
for (var i = 0; i < x; i++)
    clearTimeout(x);

Однако этот код не работал в Google Chrome. Поэтому я сделал для этого улучшение:

var x = setTimeout('alert("x");',100000); //It is very low probability that after 100 seconds x timeout will not be cleared
for (var i = 0; i <= x; i++)
    clearTimeout(i);

Наконец, это взломать, как было упомянуто в комментарии выше, поэтому используйте его осторожно.

Изменить: исправлена ​​неправильная переменная, используемая в цикле (используйте я вместо x)