回答
它們不在窗口對象中,但它們具有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. Android AlarmManager:有沒有辦法清除所有設置的鬧鐘?
- 3. 有沒有辦法清除我所有的TFS掛起更改?
- 4. 有沒有辦法清除CookieContainer?
- 5. 有沒有辦法清除uipickerview選擇?
- 6. 有沒有辦法清除AS3/AIR
- 7. 有沒有辦法阻止WatIn超時?
- 8. 有沒有辦法記錄httpsession超時?
- 9. 有沒有辦法清除TextBox的文本沒有TextChanged射擊?
- 10. 有沒有辦法清除所有用戶的會話緩存鍵?
- 11. 有沒有辦法清除所有會話中的一些會話數據?
- 12. SurveyMonkey API有沒有辦法清除收集器的所有響應?
- 13. 有沒有辦法刪除所有會話/清除同一個itme中的所有身份?
- 14. 有沒有辦法清理Python包?
- 15. 放棄會議沒有清除所有
- 16. Facebook的OAuth - 有沒有辦法'清除'以前的用戶?
- 17. 有沒有辦法使用javascript清除緩存和Cookie?
- 18. SQL查詢太長了,有沒有辦法清除代碼?
- 19. 碼頭不起作用:有沒有辦法清除它?
- 20. 有沒有辦法清除一個函數執行後?
- 21. 有沒有辦法清除Curse的事件隊列?
- 22. 有沒有辦法檢測通知欄是否已被清除?
- 23. 有沒有辦法在php中清除表單數據?
- 24. 有沒有辦法清除IBM MobileFirst Platform服務器緩存?
- 25. 有沒有辦法清除控制檯的某個部分?
- 26. Famo.us:有沒有辦法清除視圖發出的「散發」?
- 27. 有沒有辦法清除IE8中的XDomainRequest.responseText
- 28. 有沒有辦法阻止Azure存儲PutBlock方法超時?
- 29. 有沒有辦法在沒有SSL證書的情況下清除HSTS?
- 30. 在PHP中 - 有沒有辦法知道fsockopen何時超時?
可能重複[如何停止所有超時和間隔使用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