【问题标题】:Tampermonkey script getting overwrittenTampermonkey 脚本被覆盖
【发布时间】:2020-03-28 15:46:36
【问题描述】:

我正在尝试使用 tampermonkey 从网页上的列表中删除 html 元素,但在大约 0.5 秒后,其余元素被覆盖了一半 -

原来:[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 = "";
  }

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

【问题讨论】:

  • 您是否试图确保目标页面上没有&lt;script&gt; 标记运行?
  • 正如我所提到的 - 它是可选的。我相信我有以下选择:1. 阻止脚本在我的之后运行 2. 阻止脚本修改我修改的元素 3. 祈祷删除所有脚本仍然会加载我想要的内容

标签: javascript tampermonkey


【解决方案1】:

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

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

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

【讨论】:

  • 工作就像一个魅力!我不得不使用这种方法将我的脚本分成 2 个 - 文档开始剥离 javascript,文档结束来修改我想要的内容:)
  • 如果您愿意,可以通过将其余部分放入 DOMContentLoaded 侦听器来使用单个脚本
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2015-06-17
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多