Tampermonkey 脚本被覆盖

Tampermonkey script getting overwritten

我正在尝试使用 tampermonkey 从网页的列表中删除 html 个元素,但在 ~0.5 秒后,剩余的元素被半覆盖 -

原来:[项目 1 links 到项目 1,项目 2 links 到项目 2,项目 3 links 到项目 3]

在我的脚本之后的 0.5 秒内,一切都很完美:[项目 2 links 到项目 2,项目 3 links 到项目 3]

然后元素被覆盖(即使悬停显示正确):[item 2 links to item 1, item 3 links to item 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 = "";
  }

后台仍有某种脚本运行覆盖了默认的link...我的脚本覆盖buggy/not够了吗?或者有更好的方法来解决这个问题吗?

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

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

如果您想确保页面 运行 没有任何自己的脚本,请在页面加载开始时将 MutationObserver 附加到整个文档,并在添加脚本标签时将其删除. MutationObserver 运行s 将在 之前 的微任务,脚本内容将 运行:

<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>

确保您的用户脚本 运行s 具有即时脚本注入和 document-start,以确保它 运行s before 上的任何内容该页面存在。 (如果页面能够在您的用户脚本 运行 之前获取脚本,它可以做任何它想做的事情)