我正在寻找匹配字符串在一个.json列表名为“mylist”与可见字符串只在任何网页上任何时候他们出现。匹配的字符串将被替换为“REPLACED!”在脚本中。
最重要的是,脚本应该在现代浏览器上工作,而不是降低页面加载性能。所以我会很感激任何优化技巧!
以下是我目前得到的:
@resource mylist https://example.com/mylist.json
(function(){
var mylist = JSON.parse(GM_getResourceText("mylist"));
var regexp = new RegExp('\\b(' + mylist.join('|') + ')\\b(?!\\)\\))', "gi");
function walk(node) {
var child, next;
switch ( node.nodeType )
{
case 1:
case 9:
case 11:
child = node.firstChild;
while ( child )
{
next = child.nextSibling;
walk(child);
child = next;
}
break;
case 3:
handleText(node);
break;
}
}
function handleText(textNode) {
textNode.nodeValue = textNode.nodeValue.replace(regexp, 'REPLACED!');
}
walk(document.body);
})();
我在这里做了一个示例:https://jsfiddle.net/xgnocwbq/
我面临的最大问题是,在某些页面上,剧本起作用了。在其他人身上,它根本不起作用。例如,在Qwant搜索结果中,我的代码根本不起作用。在Google搜索结果中,它是。
2条答案
按热度按时间7z5jn7bk1#
JavaScript替换可见文本Regex
首先,你的代码中有一些主要的问题:
***动态内容:**Google或Facebook等网站使用
AJAX
等特殊方法来刷新和更新内容,而无需重新加载整个页面。您的代码仅在页面首次加载时查看页面一次。如果稍后页面上出现更多内容,您的代码将看不到它。通过使用MutationObserver
,您可以轻松处理动态内容。***性能:**当前您正在遍历每个节点,这在具有大量DOM元素的页面上可能会很慢。使用
document.querySelectorAll
提高性能。它只抓取文本节点,这是一种更快的方法。以下是您的代码调整后的版本:
如果改进后的脚本在某些网站上仍然无法工作,则必须使用浏览器开发人员工具仔细检查该网站,以了解其可能干扰代码的特定行为或障碍。
更新:
请查看this answer,因为它修复了这个问题。
whhtz7ly2#
修复@AztecCodes工作,唯一的问题是使用
querySelector()
函数,而不是使用childNodes
属性。