首页 > 解决方案 > 用 Tampermonkey 在每一页上连续替换一个单词

问题描述

我想创建一个脚本,将页面中的一个单词更改为另一个单词,适用于 SPA、动态加载的内容以及任何人类可读的地方:大多数标签和可见属性的 textNodes。

我能想到的最好的方法是:

// ==UserScript==
// @name         Hurr-durr
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  durr hurr
// @author       You
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    document.title = document.title.replace(/AAA/g, 'BBB');
    replaceInText(document.body, "AAA", "BBB");
    setInterval(function() {
        document.title = document.title.replace(/AAA/g, 'BBB');
        replaceInText(document.body, "AAA", "BBB");
    }, 10000);
})();


function replaceInText(element, pattern, replacement) {
    for (let node of element.childNodes) {
        switch (node.nodeType) {
            case Node.ELEMENT_NODE:
                replaceInText(node, pattern, replacement);
                break;
            case Node.TEXT_NODE:
                node.textContent = node.textContent.replace(pattern, replacement);
                break;
            case Node.DOCUMENT_NODE:
                replaceInText(node, pattern, replacement);
        }
    }
}

它递归地通过 DOM 找到 textNodes 并对它们进行字符串替换。

我遇到的问题:

  1. 属性。我不知道什么值得更换,什么不值得。从这个确切的方面是否有可用的列表?我不关心大多数元数据,咏叹调(对不起),img alt,所以替换所有属性似乎是一种非常浪费的方法。

  2. setInterval用于动态内容。它工作正常,但非常粗糙,将超时设置得太低显然是资源浪费,而太高有时会导致无法及时更换。是否有 - 例如 - 当某些东西进入 DOM 并替换我想要的东西时订阅更便宜的事件?

标签: javascripttampermonkeydom-traversaltext-manipulation

解决方案


推荐阅读