如何使用JQuery替换语句但排除一个类?

时间:2016-08-16 19:21:19

标签: javascript jquery

我有一个搜索引擎。当您转到下一页时,搜索栏中的关键字会在页面上突出显示。但是,有一个我不想突出显示的特定链接。荧光笔正在搞乱链接网址,所以我得到了一个类似的链接:<a href='page.php?url=ha<mark>ppy</mark>'</a> ha<mark>ppy</mark></a>

这是我正在使用的代码:

function term(word) {
    var src_str = $("#page").html();
var term = word;
term = term.replace(/(\s+)/,"(<[^>]+>)*$1(<[^>]+>)*");
var pattern = new RegExp("("+term+")", "gi");

src_str = src_str.replace(pattern, "<mark>$1</mark>");
src_str = src_str.replace(/(<mark>[^<>]*)((<[^>]+>)+)([^<>]*<\/mark>)/,"$1</mark>$2<mark>$4");

$("#page").html(src_str);
}

我希望代码具有相同的替换功能,但不能替换.topic_link

修改

问题不仅在于.topic_link。代码会影响页面的所有 html 。因此,如果我搜索“div”,所有外部HTML代码都会受到影响。有没有办法只影响文档的文本而不影响HTML?

1 个答案:

答案 0 :(得分:2)

您似乎必须穿过孩子并检查他们的node types。 由于每个孩子都可以有其他孩子,因此必须进行递归:

function changeText(word,element) {   
  $.each(element.contents(),function(){
    if(this.nodeType == 1)
      changeText(word,$(this));
    else if(this.nodeType == 3)
    {
      $(this).replaceWith(term(word,$(this).text()));
    }
  });

}

function term(word,src_str) {

  var term = word;
  term = term.replace(/(\s+)/,"(<[^>]+>)*$1(<[^>]+>)*");
  var pattern = new RegExp("("+term+")", "gi");

  src_str = src_str.replace(pattern, "<mark>$1</mark>");
  src_str = src_str.replace(/(<mark>[^<>]*)((<[^>]+>)+)([^<>]*<\/mark>)/,"$1</mark>$2<mark>$4");

  return src_str;
}

现在打电话:

changeText("YourWord",$("#page"));

这已经过少量数据测试,因此我不知道它是否足够有效。