【发布时间】:2011-04-20 07:32:05
【问题描述】:
我正在使用 ajax 和 asp.net。我有一个 javascript 函数,它使用 setTimeout 创建许多其他 javascript 函数。异步回发发生后,我想禁用所有这些 setTimeouted 事件。我该怎么做?
【问题讨论】:
标签: javascript asynchronous postback settimeout
我正在使用 ajax 和 asp.net。我有一个 javascript 函数,它使用 setTimeout 创建许多其他 javascript 函数。异步回发发生后,我想禁用所有这些 setTimeouted 事件。我该怎么做?
【问题讨论】:
标签: javascript asynchronous postback settimeout
你可以使用clearTimeout()在另一个函数中停止一个函数的setTimeout()
var myVar;
function myFunction() {
myVar = setTimeout(function(){ alert("Hello"); }, 3000);
}
function myStopFunction() {
clearTimeout(myVar);
}
【讨论】:
首先,我使用的是这段代码:
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);
最后,它是一个 hack,正如上面评论中提到的,所以小心使用它。
编辑:修复循环中使用的错误变量(使用 i 代替 x)
【讨论】:
如果您无法访问设置计时器的代码,尼克的答案可能不起作用,所以我能想到的就是这个 hack。
这是一个hack,谨慎使用!
// Set a fake timeout to get the highest timeout id
var highestTimeoutId = setTimeout(";");
for (var i = 0 ; i < highestTimeoutId ; i++) {
clearTimeout(i);
}
基本上,它会抓取最高的计时器 id 并清除所有低于此值的内容。 但也可以清除您不想清除的其他计时器!
【讨论】:
当您调用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() 不会抛出错误,因此这里不存在比赛/计时问题。
【讨论】:
clearTimeout() 不会在传递无效 ID 的情况下发生异常(如果已经发生超时)。
不确定是否可以全局执行此操作,但最常用的方法是使用clearTimeout。您将 setTimeout() 的返回值传递给 clearTimeout(),您可以使用全局变量来存储所有超时变量。
【讨论】: