2012-01-14 99 views
61

有没有办法清除给定窗口的所有超时时间?我想超时被存储在window对象的某个地方,但无法证实这一点。有没有办法清除所有超时?

欢迎任何跨浏览器解决方案。

+0

可能重复[如何停止所有超时和间隔使用JavaScript?](http://stackoverflow.com/questions/3141064/how-to-stop-all-timeouts-and-intervals-using-javascript) – 2015-02-27 07:37:03

+0

伙计,这个问题来自3年前,并有很好的答案。没有必要搞砸了。 – marcio 2015-02-27 09:16:56

+0

我搜索了这个,找到了两个。你的年龄比较大,所以我认为将两个问题归结为一个问题会是一件好事。我只有一票;相当多的人需要投票结束,而重复的链接可能会帮助其他人。 – 2015-02-27 10:43:29

回答

95

它们不在窗口对象中,但它们具有ids,它们(afaik)是连续的整数。

所以,你可以清除所有超时像这样:

var id = window.setTimeout(function() {}, 0); 

while (id--) { 
    window.clearTimeout(id); // will do nothing if no timeout with id is present 
} 
+1

这是规范的一部分,还是可能取决于实现? – 2012-01-14 04:47:52

+0

这绝对取决于实现。但是我知道的所有浏览器都使用一些增量机制。可能不会从1开始。 – user123444555621 2012-01-14 04:56:29

+4

它不需要从1开始。[HTML5](http://www.w3.org/TR/html5/timers.html#timers)规范说“让句柄是一个用户代理定义的整数大于零将识别由此调用设置的超时。“这为句柄留下了任何正整数,包括非连续和非小整数。 – 2012-01-14 04:59:11

58

我想做到这一点最简单的方法是将所有的setTimeout标识符存储在一个阵列,在那里你可以轻松地重复,以clearTimeout()所有的他们。

var timeouts = []; 
timeouts.push(setTimeout(function(){alert(1);}, 200)); 
timeouts.push(setTimeout(function(){alert(2);}, 300)); 
timeouts.push(setTimeout(function(){alert(3);}, 400)); 

for (var i=0; i<timeouts.length; i++) { 
    clearTimeout(timeouts[i]); 
} 
+11

这有奖金(或潜在的缺点,我猜)只能清除*你设置的奖金,所以你不会无意间破坏外部代码。 – 2012-01-14 04:48:43

+1

+1,不会清除所有超时,但是一次很好地解决一组特定的超时问题 – marcio 2012-01-14 05:58:04

+1

这是最好的解决方案,因为它不会破坏外部代码,但是由于我询问了如何清除所有超时,我最终结束了接受@ Pumbaa80回答:) – marcio 2014-06-10 23:20:03

1

使用全局超时,其中所有其他函数都从中获取时间。这将使所有内容运行得更快,并且更容易管理,尽管它会为代码添加一些抽象。

+0

我不完全理解你。你的意思是扩展'set_timeout'全局函数的行为?你能举一个例子代码吗? – marcio 2012-01-17 18:27:12

+1

我只是说你有一个全局超时每50ms运行一次。每个其他需要时间元素的函数都会从全局超时中获取它。谷歌切换到这个效率,虽然我不能再找到引用它的文章。 – 2012-01-17 18:44:57

9

我有一个Pumbaa80's answer的补充,这可能是有用的开发旧IE浏览器的人。

是的,所有主流浏览器都将超时ID设置为连续整数(即not required by specification)。通过浏览器和浏览器的起始号码不同。看起来,Opera,Safari,Chrome和IE> 8会从1开始超时ID,从2开始基于Gecko的浏览器和IE= 8从一些随机数开始,这些随机数在整个标签刷新过程中被神奇​​地保存。你可以discover it yourself

所有这一切meens在IE < = 8 while (lastTimeoutId--)周期可能运行在8digits倍,显示“此页上的脚本导致IE浏览器运行缓慢”的消息。所以如果你不能save all you timeout id's或不想override window.setTimeout你可能会考虑保存页面上的第一个超时ID并清除超时。你想

+0

加上一个澄清一些更详细的信息。 – 2015-01-12 12:20:24

5

var clearAllTimeouts = (function() { 
    var noop = function() {}, 
     firstId = window.setTimeout(noop, 0); 
    return function() { 
     var lastId = window.setTimeout(noop, 0); 
     console.log('Removing', lastId - firstId, 'timeout handlers'); 
     while (firstId != lastId) 
      window.clearTimeout(++firstId); 
    }; 
}); 

然后明确表示,可能是由外来代码设置的所有挂起超时了这么多次怎么样存储在一个全局超时IDS:

早期页面加载执行代码数组,并定义一个将函数调用委托给窗口的方法。

GLOBAL={ 
    timeouts : [],//global timeout id arrays 
    setTimeout : function(code,number){ 
     this.timeouts.push(setTimeout(code,number)); 
    }, 
    clearAllTimeout :function(){ 
     for (var i=0; i<this.timeouts.length; i++) { 
      window.clearTimeout(this.timeouts[i]); // clear all the timeouts 
     } 
     this.timeouts= [];//empty the id array 
    } 
}; 
1

我们刚发布了一个解决这个问题的软件包。

npm install time-events-manager

有了这一点,你可以通过timeoutCollection & intervalCollection对象查看所有超时和间隔。 还有一个removeAll函数可以清除集合和浏览器中的所有超时/间隔。

相关问题