2012-01-14 72 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函數可以清除集合和瀏覽器中的所有超時/間隔。

相關問題