Greasemonkey:突出显示 HTML 文件中的多个单词
Greasemonkey: Highlight many words in a HTML-File
我想使用 Greasemonkey 来突出显示两个词,例如"Basel, Bern"。如果我只使用 Basel,则下面的版本有效。不是很好,但足够好。但是当我使用两个词时,突出显示不起作用。
// ==UserScript==
// @name highlight-some-words
// @description highlight some words in html
// @grant none
// ==/UserScript==
document.body.innerHTML= document.body.innerHTML.replace(/Basel|Bern/g, function(m){
return '<span style="background-color:lightgreen">'+m+'</span>'
});
编辑:有趣的是,该脚本适用于 whosebug.com 但不适用于 google.com。为什么?那么如何修改脚本呢?
正如我在评论中所说,在搜索巴塞尔和伯尔尼之后,在 google.com 上(通过控制台)工作正常......也许作为 GM 脚本它是 运行 太早了
@wOxxOm 提出了一个很好的观点 - 更改 innerHTML 会弄乱页面中的事件处理程序,更好的方法是仅更改文本节点。以下可能不是执行此操作的最有效方法,但它是我多年前编写的 greasemonkey 脚本的衍生版本,那时候 greasemonkey 还不到一岁!!
function highlightWord(word) {
var xpath = "//text()[contains(., '" + word + "')]";
var texts = document.evaluate(xpath, document.body, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (n = 0; n < texts.snapshotLength; n++) {
var textNode = texts.snapshotItem(n);
var p = textNode.parentNode;
var a = [];
var frag = document.createDocumentFragment();
textNode.nodeValue.split(word).forEach(function(text, i) {
var node;
if (i) {
node = document.createElement('span');
node.style.backgroundColor = 'lightgreen';
node.appendChild(document.createTextNode(word));
frag.appendChild(node);
}
if (text.length) {
frag.appendChild(document.createTextNode(text));
}
return a;
});
p.replaceChild(frag, textNode);
}
}
highlightWord('Basel');
highlightWord('Bern');
我想使用 Greasemonkey 来突出显示两个词,例如"Basel, Bern"。如果我只使用 Basel,则下面的版本有效。不是很好,但足够好。但是当我使用两个词时,突出显示不起作用。
// ==UserScript==
// @name highlight-some-words
// @description highlight some words in html
// @grant none
// ==/UserScript==
document.body.innerHTML= document.body.innerHTML.replace(/Basel|Bern/g, function(m){
return '<span style="background-color:lightgreen">'+m+'</span>'
});
编辑:有趣的是,该脚本适用于 whosebug.com 但不适用于 google.com。为什么?那么如何修改脚本呢?
正如我在评论中所说,在搜索巴塞尔和伯尔尼之后,在 google.com 上(通过控制台)工作正常......也许作为 GM 脚本它是 运行 太早了
@wOxxOm 提出了一个很好的观点 - 更改 innerHTML 会弄乱页面中的事件处理程序,更好的方法是仅更改文本节点。以下可能不是执行此操作的最有效方法,但它是我多年前编写的 greasemonkey 脚本的衍生版本,那时候 greasemonkey 还不到一岁!!
function highlightWord(word) {
var xpath = "//text()[contains(., '" + word + "')]";
var texts = document.evaluate(xpath, document.body, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (n = 0; n < texts.snapshotLength; n++) {
var textNode = texts.snapshotItem(n);
var p = textNode.parentNode;
var a = [];
var frag = document.createDocumentFragment();
textNode.nodeValue.split(word).forEach(function(text, i) {
var node;
if (i) {
node = document.createElement('span');
node.style.backgroundColor = 'lightgreen';
node.appendChild(document.createTextNode(word));
frag.appendChild(node);
}
if (text.length) {
frag.appendChild(document.createTextNode(text));
}
return a;
});
p.replaceChild(frag, textNode);
}
}
highlightWord('Basel');
highlightWord('Bern');