突出显示搜索词(仅选择叶节点)

Nel*_*mel 4 jquery highlighting

我想在页面上突出显示搜索字词,但不要弄乱任何HTML标记.我想的是:

$('.searchResult *').each(function() {
    $(this.html($(this).html().replace(new RegExp('(term)', 'gi'), '<span class="highlight">$1</span>'));
)};
Run Code Online (Sandbox Code Playgroud)

但是,$('.searchResult *').each匹配所有元素,而不仅仅是叶节点.换句话说,匹配的一些元素在其中包含HTML.所以我有几个问题:

  1. 我怎样才能匹配叶节点?
  2. 是否有一些内置的jQuery RegEx函数来简化事情?就像是:$(this).wrap('term', $('<span />', { 'class': 'highlight' }))
  3. 有没有办法做一个简单的字符串替换而不是RegEx?
  4. 还有其他更好/更快的方法吗?

非常感谢!

gbl*_*zex 7

[ 看到它在行动 ]

// escape by Colin Snover
// Note: if you don't care for (), you can remove it..
RegExp.escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}

function highlight(term, base) {
  if (!term) return;
  base = base || document.body;
  var re = new RegExp("(" + RegExp.escape(term) + ")", "gi"); //... just use term
  var replacement = "<span class='highlight'>" + term + "</span>";
  $("*", base).contents().each( function(i, el) {
    if (el.nodeType === 3) {
      var data = el.data;
      if (data = data.replace(re, replacement)) {
        var wrapper = $("<span>").html(data);
        $(el).before(wrapper.contents()).remove();
      }
    }
  });
}

function dehighlight(term, base) {
  var text = document.createTextNode(term);
  $('span.highlight', base).each(function () {
    this.parentNode.replaceChild(text.cloneNode(false), this);
  });
}
Run Code Online (Sandbox Code Playgroud)