javascript - Tampermonkey 脚本被覆盖
问题描述
我正在尝试使用 tampermonkey 从网页上的列表中删除 html 元素,但是在 ~0.5s 之后,其余元素被覆盖了一半-
原文:[item 1链接到item 1,item 2链接到item 2,item 3链接到item 3]
在我的脚本之后的 0.5 秒内,一切都很完美:[第 2 项链接到第 2 项,第 3 项链接到第 3 项]
然后元素被覆盖(即使悬停显示正确):[项目 2 链接到项目 1,项目 3 链接到项目 2]
我假设这是由于某些脚本在后台运行,但即使我尝试通过以下方式删除所有脚本:
// @run-at document-start:
var scripts = document.getElementsByTagName('script');
for (var k = 0; k < scripts.length; k++) {
scripts[k].setAttribute('src', 'asdf');
scripts[k].innerText = "";
scripts[k].innerHTML = "";
}
仍然有某种脚本在后台运行,它覆盖了默认链接......我的脚本覆盖错误/不够吗?还是有更好的方法来解决这个问题?
解决方案
如果您在文档开始时运行用户脚本,则页面可能尚未加载 - 将没有要删除的标签。
如果您正常运行用户脚本,页面将已经加载 - 脚本标签可能已经运行。
如果您想确保页面不运行任何自己的脚本,请在页面加载开始时将 MutationObserver 附加到整个文档,并在添加脚本标签时将其删除。MutationObserver 运行期间的微任务将在脚本内容运行之前:
<script>
// Example userscript code
const observer = new MutationObserver((mutations) => {
for (const { addedNodes} of mutations) {
for (addedNode of addedNodes) {
if (addedNode.nodeType === 1 && addedNode.tagName === 'SCRIPT') {
console.log('script removed');
addedNode.remove();
}
}
}
});
observer.observe(document.documentElement, { childList: true, subtree: true });
</script>
<script>
console.log('Example page script running');
</script>
<div>
Content
<script>
console.log('Example nested page script running');
</script>
</div>
确保您的用户脚本通过即时脚本注入运行,并且document-start
确保它在页面上的任何内容存在之前运行。(如果页面能够在您的用户脚本运行之前获取脚本,它可以做任何它想做的事情)
推荐阅读
- javascript - D3 圆形路径描边角
- python - 如何使用 matplotlib 绘制 1 和 0 的列表?
- javascript - 更改 JSXGraph 中滑块的可见性
- python - Django decorator_from_middle type_error
- reactjs - 我的 Apache 服务器显示的是目录列表,而不是提供我的文件——如何正确配置它?
- amazon-web-services - 弹性 Beantalks 代理
- php - 如何以雄辩的方式从查询中返回 JSON 响应?
- java - 程序在手动终止之前不会完全执行
- google-apps-script - 如何在不通过 Admin SDK 的情况下从 BASE Google 用户对象或电子邮件中获取用户名?
- c++ - 使用测试套件,如何让测试显示在 Qt5 的“测试”窗格视图中?