假设有人(邪恶的人)为我们设置了一个带有setInterval
的计时器,但是我们不知道它的ID(我们没有对该对象的引用,setInterval正在返回,也没有它的值)
(function(){
setInterval(function(){console.log('pwned')},
10000)
})();
有没有办法,如何清除呢?是否可以通过其他方式访问计时器?或至少是特定的浏览器/javascript引擎?
大卫·弗拉纳根(David Flanagan)在他的大JSTDG身上碰到了类似话题。
索引中的
setInterval() method, use in malicious code
键指向最佳答案
通过快速测试,所有主流浏览器(最新的Chrome,Firefox和IE)都提供了非常小的数字作为ID,因此只需“盲目”循环所有可能的数字就可以正常工作:
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就无法停止特定的间隔。
您可以自己进行测试,它应该可以在上述所有主要浏览器上使用。