Javascript 使用Tampermonkey更改网站文本

Javascript 使用Tampermonkey更改网站文本,javascript,html,tampermonkey,Javascript,Html,Tampermonkey,所以基本上我想把一个W文本改成B。我下面的代码运行得很好,但是当你刷新显示W文本的页面时会有一个延迟,然后用一个B替换它。我的第二个问题是,大约每刷新20次,B文本就不会替换原来的文本。有人能帮我修复代码,这样它就不会犯这两个错误了,谢谢 window.onload = function () { /* Add your logic here */ var my_div = document.getElementsByClassName('c')[3] my_div.fi

所以基本上我想把一个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结构后立即运行

如果在运行userscript时文档可能已经是交互式的,则不要附加侦听器,只需运行一个函数立即更改文本:

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);
  }
}
但是链接中的文档很大,即使DOM解析也需要很长时间,那么上面的速度可能不够快,在这种情况下,您可以在pageload开始时将MutationObserver附加到文档(使用
@run at document start
和即时脚本注入),并更改
文档。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 });

documentstart
并不完全可靠,但有时执行这样的脚本需要一些时间。如果您恰好处于脚本不能立即运行的环境中,也可以通过Tampermonkey设置(配置模式:高级,滚动到最底部,注入模式:instant)启用实验性即时脚本注入。在带有图像和外部脚本等的较大页面上,这可能需要一段时间,尤其是在连接不好的情况下

改为附加一个
DOMContentLoaded
侦听器,该侦听器将在浏览器下载并解析DOM结构后立即运行

如果在运行userscript时文档可能已经是交互式的,则不要附加侦听器,只需运行一个函数立即更改文本:

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);
  }
}
但是链接中的文档很大,即使DOM解析也需要很长时间,那么上面的速度可能不够快,在这种情况下,您可以在pageload开始时将MutationObserver附加到文档(使用
@run at document start
和即时脚本注入),并更改
文档。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 });

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

很抱歉,我复制并粘贴了您的代码,但它不起作用。您说的“不起作用”是什么意思?回调应该运行。pageload上是否不存在
.c
元素?需要一个首先我想道歉,我是这个论坛和编码新手。现在来回答你的问题,当我重新加载页面时,W不会像在原始代码中那样变成B。当我查看chrome developer的错误时,它找不到任何错误。你能发布一个说明问题的帖子,或者至少链接到你正在运行脚本的页面吗?如果没有错误,则表示脚本正在运行,并且正在查找要更改的
.c
,并且正在更改它。(除非该网站已经修补了monkeypatched
addEventListener
,使其无法运行,这是极不可能的。)但如果没有说明问题,就不可能知道解决方案是什么。在我的原始帖子W中添加了一张图片,W,W我想将W改为a B。顺便谢谢你的帮助!!很抱歉,我复制并粘贴了你的代码,但它不工作。你说“不工作”是什么意思?回调应该运行。pageload上是否不存在
.c
元素?需要一个首先我想道歉,我是这个论坛和编码新手。现在来回答你的问题,当我重新加载页面时,W不会像在原始代码中那样变成B。当我查看chrome developer的错误时,它找不到任何错误。你能发布一个说明问题的帖子,或者至少链接到你正在运行脚本的页面吗?如果没有错误,则表示脚本正在运行,并且正在查找要更改的
.c
,并且正在更改它。(除非该网站已经修补了monkeypatched
addEventListener
,使其无法运行,这是极不可能的。)但如果没有说明问题,就不可能知道解决方案是什么。在我的原始帖子W中添加了一张图片,W,W我想将W改为a B。顺便谢谢你的帮助!!