2009-12-13 1204 views
23

我使用jQuery .load爲我的網站構建了一個自動刷新註釋部分。所以我使用javascript'setTimeout'計時器來檢查新評論。有沒有辦法一次清除所有JavaScript定時器?

但是在做了一些諸如改變評論頁面或刪除(全部使用ajax)之類的東西之後,即使我在加載新的ajax內容之前使用了clearTimeout,幾個老的定時器仍在運行。

當我加載新的ajax內容時,是否有某種方法可以清除所有javascript定時器?

回答

23

JavaScript中沒有一般函數可以讓您清除所有計時器。您需要跟蹤您創建的所有計時器。爲此,您可以使用全局數組:

var timers = []; 
... 
// add a timer to the array 
timers.push(setTimeout(someFunc, 1000)); 
... 
// clear all timers in the array 
for (var i = 0; i < timers.length; i++) 
{ 
    clearTimeout(timers[i]); 
} 
+0

問題是我的新加載的ajax內容無法控制舊的運行計時器。 – Jens 2009-12-13 16:04:03

+0

這就是爲什麼我建議一個全局變量。 – 2009-12-13 16:05:08

+0

謝謝,對我來說,你的回答也有幫助 – beginner 2013-10-07 20:34:28

2

您可能需要考慮使用jQuery Timers來代替setTimeout/setInterval的許多「醜陋」細節,並使它們更易於在您的代碼中使用,如描述的內容。

+2

鏈接過時 – Benubird 2013-03-27 14:34:03

+0

的@Benubird - 不幸的是最近的一次,我可以找到。如果你有一個更新的,請讓我知道... – 2013-03-27 14:37:51

+0

是的,看起來像沒有當前版本(http://stackoverflow.com/questions/3674566/where-can-i-download-jquery-timers),可能不再可用。 – Benubird 2013-03-27 14:41:30

39

警告:我的代碼波紋管是有問題的,主要是因爲需求本身是有問題的。我想知道你爲什麼要清除所有計時器任何方式。這會讓你的代碼破壞使用定時器的任何插件。這比你想象的要普遍得多,除非你正在調試或玩得開心,那麼這並不重要。


如果你必須:

這是最糟糕的解決方案之一。但是,它揭示了JavaScript本身的一個潛在安全漏洞。但由於它只是作品(清除所有定時器),我認爲這將是冷靜地分享:

var maxId = setTimeout(function(){}, 0); 

for(var i=0; i < maxId; i+=1) { 
    clearTimeout(i); 
} 
+4

雖然接受的答案是一個很酷的最佳做法,但它回答了標題中提出的問題。 – 2012-12-27 06:38:36

+0

不錯的主意,謝謝! – HATCHA 2013-06-07 04:44:33

+0

這是很棒的解決方案!無論如何,我猜這是跨瀏覽器? – 0xC0DEGURU 2013-09-11 15:20:27

相關問題