首页 > 解决方案 > 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 = "";
  }

仍然有某种脚本在后台运行,它覆盖了默认链接......我的脚本覆盖错误/不够吗?还是有更好的方法来解决这个问题?

标签: javascripttampermonkey

解决方案


如果您在文档开始时运行用户脚本,则页面可能尚未加载 - 将没有要删除的标签。

如果您正常运行用户脚本,页面将已经加载 - 脚本标签可能已经运行。

如果您想确保页面不运行任何自己的脚本,请在页面加载开始时将 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确保它在页面上的任何内容存在之前运行。(如果页面能够在您的用户脚本运行之前获取脚本,它可以做任何它想做的事情)


推荐阅读