Javascript 无ID的clearTimeout

Javascript 无ID的clearTimeout,javascript,timer,settimeout,Javascript,Timer,Settimeout,如果没有显式ID,有没有办法清除setTimeout()? 问题是我不允许在没有任何处理程序的情况下更改一些已经运行的代码并设置计时器 JS是否为它们设置了“匿名处理程序”?这些计时器是否存储在任何可访问的地方?我是否可以获取这些属性中的任何一个(计时器将要调用的函数?调用它的时间?否。clearTimeout方法要求提供从setTimeout返回的ID以删除超时 你能发布一些关于你的场景的更多信息吗?也许是一些代码片段?也许有一种方法可以解决这个问题。不,没有参考资料就不行。您可以尝试一些真正

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


JS是否为它们设置了“匿名处理程序”?这些计时器是否存储在任何可访问的地方?我是否可以获取这些属性中的任何一个(计时器将要调用的函数?调用它的时间?

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


你能发布一些关于你的场景的更多信息吗?也许是一些代码片段?也许有一种方法可以解决这个问题。

不,没有参考资料就不行。您可以尝试一些真正的hacky(不要这样做!这只是hackynes的一个例子)来清除所有超时:

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

for(var i=0;i否。但您可以让处理程序检查它是否仍应处理事件(使用布尔变量)。

另一种可能的黑客方法是在超时时间内的某个位置抛出错误。要使此方法起作用,必须(a)在
try catch
块中不捕获错误;以及(b)在超时有机会执行您不喜欢的操作之前发生。根据超时的内容,这可能是容易的、困难的或不可能的

例如,如果按如下方式注册超时:

setTimeout(function(){
   if(document.URL.toUpperCase() === "..."){
      // do something that you don't like
   }
}, 60000);
然后(我认为)抛出错误的唯一方法是对函数
String.prototype.toUpperCase
进行猴子补丁,并检查调用函数是否为违规超时。您不能绝对确定地进行此检查,但
(新错误).stack
肯定会派上用场…您可以与预期的堆栈跟踪进行比较。 您可以通过monkey修补属性getter,或者通过将特定对象设置为
undefined
,来完成类似的操作。ES6可能会提供一些额外的可能性


这显然是有问题的,实际上它并没有清除超时,它只是防止它有任何外观上可观察到的行为。然而,它可能只是起到了作用!(如果性能相关,那么请小心你的猴子补丁。)

我看到clearTimeout确实需要一个ID,但我在考虑如何处理浏览器变量之类的东西。场景是这样的:一个我不能触摸的代码运行,创建没有ID的计时器,在页面结束时,一个我可以编写的代码运行,但计时器(没有ID)已设置。@djspark是否有任何方法可以为传递给
setTimeout
的函数提供包装?问题是它已被调用,因此,计时器已设置。@djspark那么我认为您可能有麻烦了。@Nick的解决方案可能是您的最佳选择是的,这将是解决方案:争取更改Source.It's will like mours:/Thanke for hackynes:)Wll这帮我调试了一个超时的页面,该页面将我从该页面重定向出去。。。把这个贴在我的控制台上。因此,这对于调试非常有用。让我解释一下为什么不这样做更好。因为您只是分解了使用setTimeout的第三方脚本。我是这些脚本的开发人员之一,如果你破坏了我的脚本,我会找到你。随着黑客解决方案的发展,非常适合与客户端GM脚本一起使用,以阉割一个特定的恼人网站,也是唯一有效的解决方案,谢谢你+1你不需要经历100000次循环,你可以用尽可能少的循环来完成:
var I=setTimeout(function(){});while(i--)clearTimeout(i);