没有ID的clearTimeout

时间:2010-12-13 22:02:31

标签: javascript timer settimeout

如果没有明确的ID,有没有办法清除setTimeout()?  问题是我不允许更改已经运行的代码并在没有任何处理程序的情况下设置定时器。

JS是否为他们设置了'匿名处理程序'?这些计时器是否存放在任何地方?我可以获得任何这些属性(计时器即将调用的函数吗?它将被调用的时间?)

4 个答案:

答案 0 :(得分:19)

不,你不能没有参考。你可以尝试真的 hacky(不要这样做!这只是一个hackyness的例子)来清除所有超时:

for(var i=0; i<100000; i++) clearTimeout(i);

但同样,这不是万无一失,而且远远超出了黑客。

解决方案?可以更改源,以便您可以正确执行此操作 - 或者查看是否可以覆盖创建计时器的功能。

答案 1 :(得分:2)

没有。 clearTimeout方法要求提供从setTimeout返回的ID以删除超时。

您是否可以发布有关您的方案的更多信息?也许一些代码片段?可能有办法解决这个问题。

答案 2 :(得分:1)

另一种可能的hacky方法是从超时内的某处抛出错误。为此,错误必须(a)不能在try-catch块内捕获; (b)在超时有机会采取您不喜欢的行动之前发生。根据超时的内容,这可能很容易,很难或不可能。

例如,如果超时的注册如下:

setTimeout(function(){
   if(document.URL.toUpperCase() === "..."){
      // do something that you don't like
   }
}, 60000);

然后我认为你可以抛出错误的唯一方法就是修补函数String.prototype.toUpperCase,并检查调用函数是否是违规超时。你无法绝对确定地进行这项检查,但(new Error).stack肯定会派上用场......你可以与预期的堆栈跟踪进行比较。 您可以通过猴子修补属性getter来执行类似的操作,也可以通过将特定对象设置为undefined来执行类似的操作。 ES6可能会提供一些额外的可能性。

这显然是hacky,它实际上并没有清除超时,它只能阻止它有任何外观可观察的行为。然而,它可能只是做的伎俩! (如果表现相关,那么请小心你的猴子修补。)

答案 3 :(得分:0)

没有。但是你可以让处理程序检查它是否仍然应该处理事件(使用布尔变量)。