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