我正在使用ajax和asp.net。我有一个使用setTimeout创建许多其他javascript函数的javascript函数。异步回发事件后,我想要禁用所有这些setTimeouted事件。我怎样才能做到这一点?如何禁用所有setTimeout事件?
回答
当您致电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。您将setTimeout()的返回值传递给clearTimeout(),您可以使用全局变量来存储所有超时变量。
如果您无法访问设置了计时器的代码,Nick的答案可能不起作用,所以我所能想到的就是这种黑客攻击。
这是一个黑客,谨慎使用!
// Set a fake timeout to get the highest timeout id
var highestTimeoutId = setTimeout(";");
for (var i = 0 ; i < highestTimeoutId ; i++) {
clearTimeout(i);
}
基本上它抓住最高的计时器id并清除所有小于这个值的东西。 但是也可以清除其他不想清除的定时器!
感谢Vaidotas,我更新了我的设置超时功能,使浏览器更加友好 – SeanDowney 2012-11-08 22:05:09
+1这是一个非常方便的代码片段,可以粘贴到Javascript控制台中关闭所有超时! – 2013-03-18 13:16:19
这个黑客确实会导致难以捕捉的错误,因为如果第三方库使用setTimout和setInterval进行初始化,那么这个库文件将无法正常工作,因为我刚发现。 – user2191332 2014-02-28 03:24:30
首先,我用这个代码:
var x = setTimeout('');
for (var i = 0; i < x; i++)
clearTimeout(x);
然而,这个代码的和平并未对谷歌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)
- 1. 如何禁用所有ng-click和ng-submit事件
- 2. 如何禁用布局的所有点击事件?
- 3. 如何通过PHP代码禁用所有刷新事件?
- 4. 如何禁用一个DIV内的标签的所有事件
- 5. 如何禁用ViewGroup的所有孩子的所有触摸事件?
- 6. 如何启用和禁用setTimeout onclick
- 7. 如何禁用事件?
- 8. 禁用使用javascript的所有控件的单击事件
- 9. 事件。currentTarget的setTimeout
- 10. 如何在WPF中禁用webrowser控件的所有文档事件?
- 11. 如何在winforms中禁用所有控件时创建Keydown事件?
- 12. 禁用所有Eclipse插件
- 13. 在高图上禁用所有用户界面事件
- 14. 禁用事件
- 15. iOS 6的js事件功能不调用,如果有setTimeout它
- 16. 如何禁用WPF中的所有或部分属性PropertyChanged事件?
- 17. 如何禁用所有点击事件需要一些div元素
- 18. 禁用Jest setTimeout模拟
- 19. 暂时禁用所有onclick事件并将其绑定回
- 20. 谷歌地图禁止所有事件的用户平移
- 21. jQuery:临时冻结/禁用所有事件?
- 22. 禁用页面上的所有点击事件(javascript)
- 23. 禁用所有点击事件,直到AJAX请求完成
- 24. 禁用所有表单的按键事件,但活动与js
- 25. Qt - 暂时禁用所有事件或窗口功能?
- 26. 在Windows窗体上禁用所有事件
- 27. 在打印预览模式下禁用所有事件
- 28. 我的NSTableView的所有键盘事件都被禁用
- 29. 禁用GoogleMaps v2视图以便忽略所有触摸事件
- 30. UIAlertController禁用屏幕上的所有触摸事件
另外值得注意的错变量,'clearTimeout()'不会通过一个异常,如果无效的ID被传递(如果超时已发生) 。 – Robert 2010-10-02 19:08:42
@罗伯特 - 好点,我倾向于认为这是理所当然的,但我会加入它,以防万一有任何顾虑:) – 2010-10-02 19:09:53
我想用javascript的单线程模型认为:在所有情况下,一旦clearTimeout完成,就可以保证超时事件不会再发生。这不是在文档中,这是不是不言而喻? – jcalfee314 2015-02-02 13:51:23