2011-07-27 95 views
20

比如,某人(邪)爲我們樹立一個計時器setInterval,但我們不知道它的ID(我們沒有參考對象,即setInterval不太返回,還是其值)如何清除未知ID的間隔?

(function(){ 
    setInterval(function(){console.log('pwned')}, 
       10000) 
})(); 

有沒有辦法,如何清除它?是否有可能以其他方式訪問計時器?或者至少在瀏覽器/ JavaScript引擎?

大衛弗拉納根接觸類似的話題他的大JSTDG。 setInterval() method, use in malicious code關鍵索引點

...有些瀏覽器檢測到重複的對話框和長時間運行的腳本,並給用戶 的選項來阻止他們。但是惡意代碼可以使用諸如setInterval()之類的方法來加載CPU,並且也可以通過分配大量內存來攻擊您的系統。網頁瀏覽器沒有一般的方式可以防止這種殘酷的攻擊。在 的做法,這不是在網絡上的常見問題,因爲沒有人返回到一個網站, 從事這種腳本濫用!

+2

相關 - http://stackoverflow.com/questions/3141064/how-to-stop-all-timeouts-and-intervals-using-javascript –

+0

嗯..另一個想法 - 做任何機會,他們給功能名稱? –

+0

影子嚮導,在這種情況下,它不幸被設置在閉包中(這有時被認爲是一個很好的功能,用於安全目的)..我知道,這個問題有點理論上的,因爲我們可能在大多數情況下,在某些瀏覽器中本地編輯惡意代碼 – mykhal

回答

36

從快速測試,所有主流瀏覽器(最新的Chrome,Firefox和IE)給予非常小的數字,作爲標識所以只是循環「盲目」在所有可能的數字應該只是罰款:

function ClearAllIntervals() { 
    for (var i = 1; i < 99999; i++) 
     window.clearInterval(i); 
} 

完整的示例:

window.onload = function() { 
 
    window.setInterval(function() { 
 
     document.getElementById("Tick").innerHTML += "tick<br />"; 
 
    }, 1000); 
 
    window.setInterval(function() { 
 
     document.getElementById("Tack").innerHTML += "tack<br />"; 
 
    }, 1000); 
 
}; 
 

 
function ClearAllIntervals() { 
 
    for (var i = 1; i < 99999; i++) 
 
     window.clearInterval(i); 
 
}
#Placeholder div { width: 80px; float: left; }
<button type="button" onclick="ClearAllIntervals();">Clear All</button> 
 
<div id="Placeholder"> 
 
    <div id="Tick"></div> 
 
    <div id="Tack"></div> 
 
</div>

這將停止所有間隔,在不知道它的路線ID不能阻止特定的時間間隔。

正如你可以自己測試一樣,它應該適用於上面提到的所有主流瀏覽器。

+3

蠻力,很好的答案,因爲我認爲OP會得到! – Jamiec

+0

也看到我下面的評論漢斯B PUFAL的答案:) – mykhal

+0

嗯,我的方式將工作,即使有很多時間間隔激活在代碼中的不同點 - 然而明顯的漢斯方式更優雅和高效。 –

10

那麼,Chrome中的經驗性試驗表明,setInterval返回一個數字,每次調用都會遞增。所以,如果你確信你的setInterval是最後一個設置以下將工作:

function clearLastInterval() { 
    var i = setInterval (function() {}, 10000); 
    clearInterval (i-1); 
    clearInterval (i); 
} 

我不知道我會推薦這雖然;-)

+0

這是一種可能的方式:) somethig像'pauseInterval'將有助於手動找到適當的計時器,因爲我們不想殺死無辜的人.. – mykhal

4

我嘗試了#Shadow Wizard建議的方法,它在清除間隔中起作用。然而,這種方法之後有副作用。在我的特殊情況下,我無法在清除所有間隔後使用jquery.fadeTo()。

我決定採用的方法是一個更簡潔的解決方案,它是重新定義setInterval方法並在重新定義的方法中保存間隔id。如此處所示,我將這些ID放入一個數組中,然後清除所有這些數據。通過稍微改進存儲陣列的結構,您可以標記它們並有選擇地清除它們。

var intervalTracking = new Array(); 
var intervalCount=0; 

window.oldSetInterval = window.setInterval; 
window.setInterval = (function(func, interval) { 
    var interval = oldSetInterval(func, interval); 
    intervalTracking[++intervalCount]=interval; 
    return interval; 
}); 

function clearAllIntervals() { 
    for (var i = 0 ; i <= intervalCount ; i++) { 
    window.clearInterval(intervalTracking[i]); 
    } 
} 

這似乎工作!

+0

不錯的一個,這是[確實有效](http://jsfiddle.net/vMRya/5/)! –

0

我通過使用localstorage解決了這個問題,保存了setInterval的id,稍後拿起它來清除那個間隔。