我正在使用ajax和asp.net。我有一个javascript函数,它使用setTimeout创建许多其他javascript函数。发生异步回发后,我想禁用所有这些setTimeouted事件。我怎么能这样做?
答案 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);
}