如何禁用所有setTimeout事件?

Mon*_*RPG 50 javascript postback asynchronous settimeout

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

Sea*_*ney 108

如果您无法访问定时器设置的代码,那么Nick的答案可能不起作用,所以我能想到的就是这个hack.

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

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

基本上它抓住了最高的计时器ID,并清除了比这更少的东西.但是也可以清除其他你不想清除的计时器!

  • +1这是一个非常方便的代码片段,可以粘贴到Javascript控制台中以关闭所有超时! (15认同)
  • 这个hack确实会导致难以捕获的错误,因为如果第三方库使用setTimout和setInterval进行初始化,那么该库将无缘无故地停止工作,就像我刚刚发现的那样. (3认同)

Nic*_*ver 101

通话时setTimeout(),请存储计时器ID,以便清除它.如果您要创建许多超时,那么数组是存储ID的好选择.例如:

var timeouts = [];
//then, store when you create them
timeouts.push( setTimeout( { ... }, 1000) );
Run Code Online (Sandbox Code Playgroud)

然后当你想清除它们时:

for (var i = 0; i < timeouts.length; i++) {
    clearTimeout(timeouts[i]);
}
//quick reset of the timer array you just cleared
timeouts = [];
Run Code Online (Sandbox Code Playgroud)

正如下面提到的@Robert,clearTimeout()如果超时已经发生,则不会抛出错误,因此这里没有竞争/时间问题.

  • 另外值得注意的是,如果传递了无效的ID(如果已经发生超时),`clearTimeout()`将不会通过异常. (4认同)