回答
它们不在窗口对象中,但它们具有ids,它们(afaik)是连续的整数。
所以,你可以清除所有超时像这样:
var id = window.setTimeout(function() {}, 0);
while (id--) {
window.clearTimeout(id); // will do nothing if no timeout with id is present
}
这是规范的一部分,还是可能取决于实现? – 2012-01-14 04:47:52
这绝对取决于实现。但是我知道的所有浏览器都使用一些增量机制。可能不会从1开始。 – user123444555621 2012-01-14 04:56:29
它不需要从1开始。[HTML5](http://www.w3.org/TR/html5/timers.html#timers)规范说“让句柄是一个用户代理定义的整数大于零将识别由此调用设置的超时。“这为句柄留下了任何正整数,包括非连续和非小整数。 – 2012-01-14 04:59:11
我想做到这一点最简单的方法是将所有的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]);
}
使用全局超时,其中所有其他函数都从中获取时间。这将使所有内容运行得更快,并且更容易管理,尽管它会为代码添加一些抽象。
我不完全理解你。你的意思是扩展'set_timeout'全局函数的行为?你能举一个例子代码吗? – marcio 2012-01-17 18:27:12
我只是说你有一个全局超时每50ms运行一次。每个其他需要时间元素的函数都会从全局超时中获取它。谷歌切换到这个效率,虽然我不能再找到引用它的文章。 – 2012-01-17 18:44:57
我有一个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并清除超时。你想
加上一个澄清一些更详细的信息。 – 2015-01-12 12:20:24
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
}
};
我们刚发布了一个解决这个问题的软件包。
npm install time-events-manager
有了这一点,你可以通过timeoutCollection
& intervalCollection
对象查看所有超时和间隔。 还有一个removeAll
函数可以清除集合和浏览器中的所有超时/间隔。
- 1. 有没有办法一次清除所有JavaScript定时器?
- 2. 有没有办法清除我所有的TFS挂起更改?
- 3. 有没有办法清除AS3/AIR
- 4. 有没有办法记录httpsession超时?
- 5. SurveyMonkey API有没有办法清除收集器的所有响应?
- 6. 有没有办法清除所有用户的会话缓存键?
- 7. 有没有办法清除所有会话中的一些会话数据?
- 8. 有没有办法删除所有会话/清除同一个itme中的所有身份?
- 9. 有没有办法清理Python包?
- 10. Famo.us:有没有办法清除视图发出的“散发”?
- 11. 有没有办法检测通知栏是否已被清除?
- 12. 有没有办法清除Curse的事件队列?
- 13. Facebook的OAuth - 有没有办法'清除'以前的用户?
- 14. 有没有办法清除IE8中的XDomainRequest.responseText
- 15. 有没有办法清除控制台的某个部分?
- 16. 码头不起作用:有没有办法清除它?
- 17. 有没有办法使用javascript清除缓存和Cookie?
- 18. 有没有办法在php中清除表单数据?
- 19. 有没有办法阻止Azure存储PutBlock方法超时?
- 20. 在PHP中 - 有没有办法知道fsockopen何时超时?
- 21. 有没有办法删除FILE_FLAG_DELETE_ON_CLOSE?
- 22. 有没有办法在运行时清除列表框中的空白值?
- 23. 有没有办法告诉浏览器在加载页面时清除缓存?
- 24. 有没有什么办法让PromiseList的结果超时
- 25. 有没有办法在tomcat中设置超时?
- 26. 有没有办法为Indy Tidhttp设置响应超时?
- 27. 有没有办法在Hadoop中配置推测执行超时?
- 28. 有没有办法让QTP中的OptionalStep超时?
- 29. Android UnknownHostException:有没有办法设置超时?
- 30. 有没有办法一次性清理特定形式的所有字段?
可能重复[如何停止所有超时和间隔使用JavaScript?](http://stackoverflow.com/questions/3141064/how-to-stop-all-timeouts-and-intervals-using-javascript) – 2015-02-27 07:37:03
伙计,这个问题来自3年前,并有很好的答案。没有必要搞砸了。 – marcio 2015-02-27 09:16:56
我搜索了这个,找到了两个。你的年龄比较大,所以我认为将两个问题归结为一个问题会是一件好事。我只有一票;相当多的人需要投票结束,而重复的链接可能会帮助其他人。 – 2015-02-27 10:43:29