我正在使用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