2010-10-02 56 views
42

我正在使用ajax和asp.net。我有一個使用setTimeout創建許多其他javascript函數的javascript函數。異步回發事件後,我想要禁用所有這些setTimeouted事件。我怎樣才能做到這一點?如何禁用所有setTimeout事件?

回答

89

當您致電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()不會拋出一個錯誤,如果已經發生超時,所以沒有種族/時間問題在這裏。

+3

另外值得注意的錯變量,'clearTimeout()'不會通過一個異常,如果無效的ID被傳遞(如果超時已發生) 。 – Robert 2010-10-02 19:08:42

+0

@羅伯特 - 好點,我傾向於認爲這是理所當然的,但我會加入它,以防萬一有任何顧慮:) – 2010-10-02 19:09:53

+0

我想用javascript的單線程模型認爲:在所有情況下,一旦clearTimeout完成,就可以保證超時事件不會再發生。這不是在文檔中,這是不是不言而喻? – jcalfee314 2015-02-02 13:51:23

4

不知道您是否可以在全球範圍內執行此操作,但最常用的方法是使用clearTimeout。您將setTimeout()的返回值傳遞給clearTimeout(),您可以使用全局變量來存儲所有超時變量。

92

如果您無法訪問設置了計時器的代碼,Nick的答案可能不起作用,所以我所能想到的就是這種黑客攻擊。

這是一個黑客,謹慎使用!

// Set a fake timeout to get the highest timeout id 
var highestTimeoutId = setTimeout(";"); 
for (var i = 0 ; i < highestTimeoutId ; i++) { 
    clearTimeout(i); 
} 

基本上它抓住最高的計時器id並清除所有小於這個值的東西。 但是也可以清除其他不想清除的定時器!

+0

感謝Vaidotas,我更新了我的設置超時功能,使瀏覽器更加友好 – SeanDowney 2012-11-08 22:05:09

+12

+1這是一個非常方便的代碼片段,可以粘貼到Javascript控制檯中關閉所有超時! – 2013-03-18 13:16:19

+2

這個黑客確實會導致難以捕捉的錯誤,因爲如果第三方庫使用setTimout和setInterval進行初始化,那麼這個庫文件將無法正常工作,因爲我剛發現。 – user2191332 2014-02-28 03:24:30

3

首先,我用這個代碼:

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)

相關問題