Javascript 替换文本,但保留google chrome扩展内容脚本中的链接

Javascript 替换文本,但保留google chrome扩展内容脚本中的链接,javascript,text,replace,google-chrome-extension,content-script,Javascript,Text,Replace,Google Chrome Extension,Content Script,我试图替换google chrome上的文字,但遇到了一个问题。我能够成功地替换特定的单词,但它会删除相关的html链接 如何使链接保持活动状态并仍然替换文本 这是我的chrome扩展内容脚本中的代码: wordDict = {"the":"piano","and":"Hello", "a":"huh?"}; for (word in wordDict) { document.body.innerHTML = document.body.innerHTML.replace(

我试图替换google chrome上的文字,但遇到了一个问题。我能够成功地替换特定的单词,但它会删除相关的html链接

如何使链接保持活动状态并仍然替换文本

这是我的chrome扩展内容脚本中的代码:

wordDict = {"the":"piano","and":"Hello", "a":"huh?"};

for (word in wordDict) {
    document.body.innerHTML = document.body.innerHTML.replace(
        new RegExp('\\b' + word + '\\b',"gi"), wordDict[word]
    );
};

我不是正则表达式方面的专家,所以这是一个解决方案,可以在页面上找到一个包含一个单词的超链接,然后用另一个单词替换它

for(var i = 0, l=document.links.length; i<l; i++) {
  if(document.links[i].innerText == "Word"){
    document.links[i].innerText = "Other Word";
  }
}

第一个jQuery循环字符串对象,第二个jQuery循环页面上的所有a标记,如果存在匹配项,它将通过对象上的值更改元素文本。

好的!两周后,我终于解决了这个问题。被忽略的是DOM中的子节点。下面我使用的代码有效地解决了childnodes并保持了脚本的原始外观

function replaceText(jsonArr) {
$("body *").textFinder(function() {
    for (var key in jsonArr) {
        var matcher = new RegExp('\\b' + key + '\\b', "gi");
        this.data = this.data.replace(matcher, jsonArr[key]);
    }
});
}

// jQuery plugin to find and replace text
jQuery.fn.textFinder = function( fn ) {
this.contents().each( scan );
// callback function to scan through the child nodes recursively
function scan() {
    var node = this.nodeName.toLowerCase();
    if( node === '#text' ) {
        fn.call( this );
    } else if( this.nodeType === 1 && this.childNodes && this.childNodes[0] && node !== 'script' && node !== 'textarea' ) {
        $(this).contents().each( scan );
    }
}
return this;
};

使用innerText而不是innerHTML如何?只需遍历DOM树即可。与其做一个简单的regex替换,不如查看树中每个节点的
.innerText
成员并替换其中的文本。(a) 它不会触及链接目标,(b)它不会导致任何事件侦听器被丢弃<代码>$('a')。文本(“任何内容”)你也可以运行一个
jQuery。each()
IteratorInertext似乎会破坏整个网站,只会吐出一堆未格式化的文本——这不是我想要的。我确实加载了jQuery。请给我一点时间来理解jquery代码的含义,这样我就可以为我的问题格式化它了。不要把你的答案当作只是粘贴了一个随机的代码片段,并且不确定它是否有效。即使它有效并且对其他人没有帮助,也不能使它看起来很好。解释问题并给出一个你认为有效的答案(并解释原因)——如果不行,有人会在评论中告诉你。我测试了两者,但这并不意味着它对他有效。。正如你所看到的,我尽力去理解和帮助他,也许那些话不是最好的(“这对你有用吗?”),但我只是想得到他对我的方法的反馈。我认为提问没有问题,但这是你答案中唯一的文字。如果您可以将其重新构造为“(简短解释)(代码),它是否有帮助?”这将是一个更好的答案。
function replaceText(jsonArr) {
$("body *").textFinder(function() {
    for (var key in jsonArr) {
        var matcher = new RegExp('\\b' + key + '\\b', "gi");
        this.data = this.data.replace(matcher, jsonArr[key]);
    }
});
}

// jQuery plugin to find and replace text
jQuery.fn.textFinder = function( fn ) {
this.contents().each( scan );
// callback function to scan through the child nodes recursively
function scan() {
    var node = this.nodeName.toLowerCase();
    if( node === '#text' ) {
        fn.call( this );
    } else if( this.nodeType === 1 && this.childNodes && this.childNodes[0] && node !== 'script' && node !== 'textarea' ) {
        $(this).contents().each( scan );
    }
}
return this;
};