假设有人(邪恶的人)为我们设置了一个带有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就无法停止特定的间隔。

您可以自己进行测试,它应该可以在上述所有主要浏览器上使用。

08-18 11:00
查看更多