问个小白问题,如何让油猴脚本中的循环异步执行

2021-07-03 09:32:46 +08:00
 zhuzhuaini

说下我的场景,一个动态加载的网页,他内容是再更新的,但是网页不刷新,这就导致了我的 JS 脚本只会被执行一次,那我就需要使用一个循环隔几秒钟就获取一下源码中的 element,如果匹配到了我要的元素,那就再执行之后的内容,如果没匹配到,那就接着循环。

我目前写了之后,他会在网页加载的一瞬间就启动这个循环,然后会话就被这个循环占用了,网页就没响应了。。。所以我希望让这个循环 和 网页的正常浏览互不影响

4053 次点击
所在节点    JavaScript
23 条回复
codehz
2021-07-03 09:41:19 +08:00
建议用 MutationObserver
huixia0010
2021-07-03 09:57:16 +08:00
时钟
geebos
2021-07-03 09:57:48 +08:00
setInterval 回调
wdssmq
2021-07-03 10:04:19 +08:00
我一般设置鼠标移动监听
flyhaozi
2021-07-03 10:08:33 +08:00
Mutation Observer 就是用来在 DOM 变化时触发回调的,不需要手动循环检测
如果要循环检测的话,应该用 setTimeout
比如
function foo() {
var elm = document.querySelector('#selector')
if(elm) {
// 实际执行代码
}else{
setTimeout(foo, 1000) // 1000ms 后重新调用 foo (准确地说是将 foo 加入任务队列)
}
}
xiaoming1992
2021-07-03 10:09:10 +08:00
或者爬虫直接请求 api ?
lemon6
2021-07-03 10:52:56 +08:00
settimeout 每隔几秒去检测一次
sugarsalt
2021-07-03 11:28:46 +08:00
MutationObserver +1
Huelse
2021-07-03 11:37:04 +08:00
如果是百度之类的网站 MutationObserver 会用不了,已经被覆盖了
si
2021-07-03 11:52:59 +08:00
setInterval,检测到了再 clearInterval
flyhaozi
2021-07-03 12:01:44 +08:00
@Huelse 竟然给覆盖成了 null,好鸡贼😂
不过试了下如果让脚本 @run-at document-start,使用 unsafeWindow 还是可以提前保存原始 MutationObserver 的引用
isukkaw
2021-07-03 12:11:27 +08:00
@flyhaozi #11 拿不到。

document-start 依然是异步插入的、此时 Main Document 都跑完了。document-start 保证的只是脚本会在 DOMContentLoaded 发生前执行完。

要想拿到引用,除非开启 油猴 Advanced Mode => Instant Inject 。
flyhaozi
2021-07-03 12:38:46 +08:00
@isukkaw 可能不同用户脚本管理器的行为不一样?我用的 Tampermonkey 默认注入模式都还是拿得到🤔
测试脚本在这: https://pastebin.com/PXxQfFmw
flyhaozi
2021-07-03 12:55:16 +08:00
@isukkaw 又试了下脚本运行时已经能获取到 head 的内容了,可能只是百度覆盖的比较晚。用这种方式的确不够稳定。
zhuzhuaini
2021-07-03 13:23:12 +08:00
楼上说的 MutationObserver 我百度找了个示例代码然后改了改发现不能用 会报错。。已经用了 settimeout 完事了 感谢楼上各位!!!稍后送上我个人的爱心
zhuzhuaini
2021-07-03 13:24:30 +08:00
MutationObserver 应该是用于检测一个元素 中属性的变化吧,而我要检测的比较特殊,他一开始没有这个元素,这个元素是后期动态加载出来的
zhuzhuaini
2021-07-03 13:25:18 +08:00
所以这个报错应该是由于 油猴脚本在网页一刷新就把脚本跑起来了,找不到这个元素 ID 自然就报错了。。。
flyhaozi
2021-07-03 13:34:12 +08:00
@zhuzhuaini #17 那就观察父节点,建议看看 MDN https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver
另外主题无关的回复就没必要感谢了,毕竟金币有限😂
zhuzhuaini
2021-07-03 13:50:32 +08:00
@flyhaozi 哈哈 我看到的就是这个 好像谷歌第一条就是 我现在碰到一个问题 比如我通过 ID 定位到了一个元素 这个元素中有许多个 tr 标签,每个 tr 标签里都有一个 class 属性 class 中 有许多值 比如有叫“even-row ui-selectee" 也有叫”odd-row ui-selectee“ 也有”odd-row ui-selectee ui-selected“ 但不管他们怎么变,只要在 tr 中 class 里 带 ” ui-selected“ 就是我想筛选出来的,这有什么快捷的方案么,,目前我查了还没什么头绪,正在继续查找-.-
zhuzhuaini
2021-07-03 13:51:46 +08:00
@flyhaozi 每个在我帖子下回复的都是花了金币的,我不能让人家光亏呀,总得给人回本~~~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/787256

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX