2010-10-02 28 views
42

我正在使用ajax和asp.net。我有一个使用setTimeout创建许多其他javascript函数的javascript函数。异步回发事件后,我想要禁用所有这些setTimeouted事件。我怎样才能做到这一点?如何禁用所有setTimeout事件?

回答

89

当您致电setTimeout()时,请存储计时器ID,以便清除它。如果你正在创建很多超时,那么一个数组是存储ID的好选择。例如:

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()不会抛出一个错误,如果已经发生超时,所以没有种族/时间问题在这里。

+3

另外值得注意的错变量,'clearTimeout()'不会通过一个异常,如果无效的ID被传递(如果超时已发生) 。 – Robert 2010-10-02 19:08:42

+0

@罗伯特 - 好点,我倾向于认为这是理所当然的,但我会加入它,以防万一有任何顾虑:) – 2010-10-02 19:09:53

+0

我想用javascript的单线程模型认为:在所有情况下,一旦clearTimeout完成,就可以保证超时事件不会再发生。这不是在文档中,这是不是不言而喻? – jcalfee314 2015-02-02 13:51:23

4

不知道您是否可以在全球范围内执行此操作,但最常用的方法是使用clearTimeout。您将setTimeout()的返回值传递给clearTimeout(),您可以使用全局变量来存储所有超时变量。

92

如果您无法访问设置了计时器的代码,Nick的答案可能不起作用,所以我所能想到的就是这种黑客攻击。

这是一个黑客,谨慎使用!

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

基本上它抓住最高的计时器id并清除所有小于这个值的东西。 但是也可以清除其他不想清除的定时器!

+0

感谢Vaidotas,我更新了我的设置超时功能,使浏览器更加友好 – SeanDowney 2012-11-08 22:05:09

+12

+1这是一个非常方便的代码片段,可以粘贴到Javascript控制台中关闭所有超时! – 2013-03-18 13:16:19

+2

这个黑客确实会导致难以捕捉的错误,因为如果第三方库使用setTimout和setInterval进行初始化,那么这个库文件将无法正常工作,因为我刚发现。 – user2191332 2014-02-28 03:24:30

3

首先,我用这个代码:

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

然而,这个代码的和平并未对谷歌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); 

最后,这是一个黑客,因为它是在评论中提及上面的,所以小心使用。

编辑:固定在循环中使用(使用I代替X)

相关问题