我怎样才能禁用所有的setTimeout事件?
我正在使用ajax和asp.net。 我有一个JavaScript函数,它使用setTimeout创build许多其他的JavaScript函数。 asynchronous回发事件后,我想要禁用所有这些setTimeouted事件。 我怎样才能做到这一点?
当你调用setTimeout()
,存储定时器ID,以便清除它。 如果你正在创build多个超时,那么一个数组是存储这个ID的好select。 例如:
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()
不会抛出错误,所以在这里没有竞争/计时问题。
如果你不能访问定时器设置的代码,尼克的答案可能不起作用,所以我能想到的就是这个黑客。
这是一个黑客,谨慎使用!
// Set a fake timeout to get the highest timeout id var highestTimeoutId = setTimeout(";"); for (var i = 0 ; i < highestTimeoutId ; i++) { clearTimeout(i); }
基本上它抓住最高的计时器ID,并清除一切比这less。 但是也可以清除其他不想清除的定时器!
不知道你是否可以在全球范围内做到这一点,但最常见的方法是使用clearTimeout 。 您将setTimeout()的返回值传递给clearTimeout(),您可以使用全局variables来存储所有超时variables。
首先,我正在使用这个代码:
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);
最后,这是一个黑客,因为它是在上面的评论中提到的,所以仔细使用它。
编辑:修正循环中使用的错误variables(使用我而不是x)