Javascript Chrome扩展-将文本添加到单词或短语的第一个实例

Javascript Chrome扩展-将文本添加到单词或短语的第一个实例,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在尝试创建一个Chrome扩展,它在加载时查找字符串的第一个实例,并添加一些细节和链接 据我所知,TreeWalker是最好的方法,因此我修改了这个示例() 这很有效(尽管我的实现效率很低)。但是我希望效果是微妙的,所以我添加了一个要求,即字符串需要出现在段落中,以减少在任何菜单或标题中替换文本的机会 现在,这种行为是不稳定的(有些更换了,有些没有) 我知道我的.replace最终实现不是正确的解决方案 有什么想法吗 var companies = [ "Apples",

我正在尝试创建一个Chrome扩展,它在加载时查找字符串的第一个实例,并添加一些细节和链接

据我所知,TreeWalker是最好的方法,因此我修改了这个示例()

这很有效(尽管我的实现效率很低)。但是我希望效果是微妙的,所以我添加了一个要求,即字符串需要出现在段落中,以减少在任何菜单或标题中替换文本的机会

现在,这种行为是不稳定的(有些更换了,有些没有)

我知道我的
.replace
最终实现不是正确的解决方案

有什么想法吗

var companies = [
        "Apples",        
        "Black Beans",
        "Sweet Potatoes"
    ];
var re = new RegExp(companies.join("|"), "i");

var walker = document.createTreeWalker(
  document.body,
  NodeFilter.SHOW_TEXT,
  function(node) {
    var matches = node.textContent.match(re);
    //look for matching text but also accept only those in paragraphs
    if((matches) && (node.parentNode.nodeName == "P")) {       
      return NodeFilter.FILTER_ACCEPT;

    } else {
      return NodeFilter.FILTER_SKIP;
    }
  },
  false);

var nodes = [];

while(walker.nextNode()) {
  nodes.push(walker.currentNode);
}


node=nodes[0]; //just replace the first hit within a paragraph

node.parentNode.innerHTML = node.parentNode.innerHTML.replace("Apples", "Apples [nutritional fact <a href='http://nutritionalinfo.com/apples'>Apples</a> ]");
node.parentNode.innerHTML = node.parentNode.innerHTML.replace("Black Beans", "Black Beans [nutritional fact <a href='http://nutritionalinfo.com/apples'>Apples</a> ]");
node.parentNode.innerHTML = node.parentNode.innerHTML.replace("Sweet Potatoes", "Sweet Potatoes[nutritional fact <a href='http://nutritionalinfo.com/apples'>Apples</a> ]");
var公司=[
“苹果”,
“黑豆”,
“红薯”
];
var re=新的RegExp(companys.join(“|”),“i”);
var walker=document.createTreeWalker(
文件正文,
NodeFilter.SHOW_TEXT,
功能(节点){
var matches=node.textContent.match(re);
//寻找匹配的文本,但也只接受段落中的文本
如果((匹配项)&&(node.parentNode.nodeName==“P”){
返回NodeFilter.FILTER\u接受;
}否则{
返回NodeFilter.FILTER\u跳过;
}
},
假);
var节点=[];
while(walker.nextNode()){
nodes.push(walker.currentNode);
}
节点=节点[0]//只需替换段落中的第一个命中
node.parentNode.innerHTML=node.parentNode.innerHTML.replace(“苹果”,“苹果[营养事实]”);
node.parentNode.innerHTML=node.parentNode.innerHTML.replace(“黑豆”、“黑豆[营养事实]”);
node.parentNode.innerHTML=node.parentNode.innerHTML.replace(“甜土豆”、“甜土豆[营养事实]”);

可能的重复(概念和答案相同:查找某个字符串并用某个字符串替换找到的字符串,可能是HTML元素)接近但不适合。我需要用一系列对应的字符串替换一系列字符串,每个字符串都包含一个链接,但我不想替换任何非纯文本的字符串,我想避免使用诸如跨距、h1等。请花几分钟时间尝试理解副本中的答案。一旦你理解了它,你就可以调整你的代码,让它按你所希望的那样工作。好吧,我努力了,我明白你的意思了。我几乎不明白我在做什么,但你肯定给我指明了正确的方向。谢谢