javascript - 用 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 并对它们进行字符串替换。
我遇到的问题:
属性。我不知道什么值得更换,什么不值得。从这个确切的方面是否有可用的列表?我不关心大多数元数据,咏叹调(对不起),img alt,所以替换所有属性似乎是一种非常浪费的方法。
setInterval
用于动态内容。它工作正常,但非常粗糙,将超时设置得太低显然是资源浪费,而太高有时会导致无法及时更换。是否有 - 例如 - 当某些东西进入 DOM 并替换我想要的东西时订阅更便宜的事件?
解决方案
推荐阅读
- azure-active-directory - 如何获取 Onedrive (for business) 文件的 UniqueId?
- android - AndroidManifest 添加 admob 后出现 14 个错误
- html - #document 是什么意思?以及如何选择该代码之外的元素?
- typescript - lib.es2015.promise.d.ts(33, 34):未提供“价值”的参数
- javascript - 如何防止div类jquery中的点击动作
- css - Angular Material Theme 不会更改 mat-dialog 强调色
- android - 如何在颤动中更改文本小部件的值
- unit-testing - vuejs 单元测试具有子组件的组件
- entity-framework - Fluent Api 复合主键
- configuration - 是否有任何配置库提供用于合并拆分文件中的修改的本机实现(如 .d 文件夹中所示)