dahua1 发表于 2022-4-6 14:48:23

在油猴中如何停止页面上的所有定时器


    var id = setInterval(function() {}, 0);
    while (id--) clearInterval(id);

在网上找到一段停止所有定时器的代码,
测试了,只能在控制台使用才有效,不明白是因为作用域问题,在油猴中使用无效



测试网站:http://bbs.runbible.cn/forum.php
比如使用下面代码删除页面元素,页面上可能有一些定时器函数一直在运行,导致控制台一直报错,


document.querySelector("head").innerHTML = ""
document.querySelector("body").innerHTML = ""




控制台就会一直这样不停的报错,


cxxjackie 发表于 2022-4-6 14:48:24

dahua1 发表于 2022-4-7 12:24
!(data/attachment/forum/202204/07/122228x8ti6u696ltlhzlu.png)




我知道了,我换了一个版本的油猴也出现了这个问题,是因为油猴在@grant unsafeWindow的情况下,提供的setInterval和clearInterval是劫持过的,他自己管理了一套定时器的逻辑,所以无法用他的clearInterval去干涉页面中的定时器。解决方法改用grant none,或者unsafeWindow.setInterval/unsafeWindow.clearInterval,这个问题在新旧版本的油猴中表现不一致。

王一之 发表于 2022-4-6 14:55:47

在油猴应该也是有效的

dahua1 发表于 2022-4-6 16:06:00

王一之 发表于 2022-4-6 14:55
在油猴应该也是有效的

试了 不行,好像在油猴里不能取消

王一之 发表于 2022-4-6 17:16:36

dahua1 发表于 2022-4-6 16:06
试了 不行,好像在油猴里不能取消
看看有没有iframe的坑

李恒道 发表于 2022-4-6 18:10:26

王一之 发表于 2022-4-6 17:16
看看有没有iframe的坑

为啥不考虑用window.setinerval劫持...
这个代码思路也太脏了

王一之 发表于 2022-4-6 18:12:05

李恒道 发表于 2022-4-6 18:10
为啥不考虑用window.setinerval劫持...
这个代码思路也太脏了

什么意思?

李恒道 发表于 2022-4-6 18:16:11

王一之 发表于 2022-4-6 18:12
什么意思?

run-at注入之后
直接windows.setinterval=()=>{}

dahua1 发表于 2022-4-6 19:58:07

李恒道 发表于 2022-4-6 18:16
run-at注入之后
直接windows.setinterval=()=>{}

我自己的代码也有使用 setinterval

李恒道 发表于 2022-4-6 21:00:53

dahua1 发表于 2022-4-6 19:58
我自己的代码也有使用 setinterval

这样的话实现就看自己怎么设计了
哪种方法都可以的
setinterval劫持要做来源过滤
如果cleareinterval的话就要做id判断
页: [1] 2
查看完整版本: 在油猴中如何停止页面上的所有定时器