我使用jQuery .load爲我的網站構建了一個自動刷新註釋部分。所以我使用javascript'setTimeout'計時器來檢查新評論。有沒有辦法一次清除所有JavaScript定時器?
但是在做了一些諸如改變評論頁面或刪除(全部使用ajax)之類的東西之後,即使我在加載新的ajax內容之前使用了clearTimeout,幾個老的定時器仍在運行。
當我加載新的ajax內容時,是否有某種方法可以清除所有javascript定時器?
我使用jQuery .load爲我的網站構建了一個自動刷新註釋部分。所以我使用javascript'setTimeout'計時器來檢查新評論。有沒有辦法一次清除所有JavaScript定時器?
但是在做了一些諸如改變評論頁面或刪除(全部使用ajax)之類的東西之後,即使我在加載新的ajax內容之前使用了clearTimeout,幾個老的定時器仍在運行。
當我加載新的ajax內容時,是否有某種方法可以清除所有javascript定時器?
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]);
}
您可能需要考慮使用jQuery Timers來代替setTimeout/setInterval的許多「醜陋」細節,並使它們更易於在您的代碼中使用,如描述的內容。
警告:我的代碼波紋管是有問題的,主要是因爲需求本身是有問題的。我想知道你爲什麼要清除所有計時器任何方式。這會讓你的代碼破壞使用定時器的任何插件。這比你想象的要普遍得多,除非你正在調試或玩得開心,那麼這並不重要。
如果你必須:
這是最糟糕的解決方案之一。但是,它揭示了JavaScript本身的一個潛在安全漏洞。但由於它只是作品(清除所有定時器),我認爲這將是冷靜地分享:
var maxId = setTimeout(function(){}, 0);
for(var i=0; i < maxId; i+=1) {
clearTimeout(i);
}
雖然接受的答案是一個很酷的最佳做法,但它回答了標題中提出的問題。 – 2012-12-27 06:38:36
不錯的主意,謝謝! – HATCHA 2013-06-07 04:44:33
這是很棒的解決方案!無論如何,我猜這是跨瀏覽器? – 0xC0DEGURU 2013-09-11 15:20:27
問題是我的新加載的ajax內容無法控制舊的運行計時器。 – Jens 2009-12-13 16:04:03
這就是爲什麼我建議一個全局變量。 – 2009-12-13 16:05:08
謝謝,對我來說,你的回答也有幫助 – beginner 2013-10-07 20:34:28