使用 Tampermonkey 更改网站的文本

Changing text of a website using Tampermonkey

所以基本上我想将 W 文本更改为 B。我下面的代码工作正常,但是当您刷新显示 W 文本然后将其替换为 B 的页面时会有延迟。我的第二个问题是每 20 次刷新左右,B 文本不会替换原始文本。有人可以帮助修复我的代码,这样它就不会犯这两个错误吗谢谢。

window.onload = function () {
    /* Add your logic here */
    var my_div = document.getElementsByClassName('c')[3]
    my_div.firstChild.nodeValue = 'B'
}

onload 处理程序将 运行 一旦 页面上的所有 资源都已完成下载。在包含图像和外部脚本等的较大页面上,这可能需要一段时间,尤其是在连接不良的情况下。

附加一个 DOMContentLoaded 侦听器,一旦 DOM 结构被浏览器下载和解析,它就会 运行。

如果文档在用户脚本 运行 时可能已经是交互式的,那么不要附加监听器,只需 运行 立即更改文本的函数:

if (window.top === window) {
  const fn = () => {
    var my_div = document.getElementsByClassName('c')[3];
    my_div.firstChild.nodeValue='B'
  };
  if (document.readyState === 'interactive' || document.readyState === 'complete') {
    fn();
  } else {
    window.addEventListener('DOMContentLoaded', fn);
  }
}

但是你link里面的文档很大,而且DOM解析的时间也很长,那么上面的可能不够快,这时候你可以附加一个MutationObserver到document 在 pageload 的开头(使用 @run-at document-start 和即时脚本注入),并在 document.getElementsByClassName('c')[3] 存在于文档中时立即更改它,如下所示:

// ==UserScript==
// @name             New Userscript
// @include          /^https://fork-accessuh-uh-edu-e3e0cca90dc751a6.sitemod.io/logout.phpsitemod/
// @run-at           document-start
// ==/UserScript==

const cs = document.getElementsByClassName('c');
new MutationObserver((mutations, observer) => {
  if (!cs[3]) {
    return;
  }
  cs[3].firstChild.nodeValue='B'
  observer.disconnect();
})
  .observe(document.documentElement, { childList: true, subtree: true });

document-start 并不完全可靠,但有时需要 一些时间 来执行这样的脚本。如果您碰巧处于脚本不会立即 运行 的环境中,也可以通过 Tampermonkey 设置启用实验性即时脚本注入(配置模式:高级,滚动到最底部,注入模式:即时)。