如何禁用所有setTimeout事件?

时间:2010-10-02 18:56:59

标签: javascript asynchronous postback settimeout

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

5 个答案:

答案 0 :(得分:104)

如果您无法访问定时器设置的代码,那么Nick的答案可能无效,所以我能想到的就是这个黑客。

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

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

基本上它抓住了最高的计时器ID并清除了所有内容。 但是也可以清除其他你不想清除的计时器!

答案 1 :(得分:97)

当您致电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()将不会抛出错误,因此此处没有竞争/时间问题。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

首先,我使用的是这段代码:

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

最后,它是一个黑客,正如上面的评论中提到的那样,所以请仔细使用它。

编辑:修复循环中使用的错误变量(使用i而不是x)

答案 4 :(得分:0)

您可以使用 setTimeout()

在另一个函数中停止一个函数的 clearTimeout()
var myVar;

function myFunction() {
  myVar = setTimeout(function(){ alert("Hello"); }, 3000);
}

function myStopFunction() {
  clearTimeout(myVar);
}