3

首先,是的,我知道那里有很多突出显示的 jquery 插件,我已经看过它们,它们让我很满意,但是现在有一个问题要问我!

为什么要使用 7kb 的插件?这应该用两行代码来解决......

这就是我正在做的事情,我正在我的 web 应用程序中搜索并且我想突出显示匹配的部分,例如我输入“ ab”作为搜索查询,然后我将由 Ajax 将这些结果加载到我的 HTML 中:

<div class="blah"><h3><a>Abicert</a></h3></div>
<div class="blah"><h3><a>The aboony test</a></h3></div>
<div class="blah"><h3><a>Abnormal abiba!!!</a></h3></div>

所以在上面的结果中,每个“ ab”都应该被突出显示,比如:

Ab icert

验血_

ab正常ab iba !!!

所以,我的 jQuery 是:

$('.blah h3 a').each(function(){
    var text = $(this).text();
    var searched_text = 'ab';
    // MY QUESTION HERE - How to highlight part of this text
});

我需要提到的另一件事是:用户可能输入“ ab anotherquery”作为他的搜索查询,所以这应该用空格展开,并且在结果中每个“ ab”和“ anotherquery”都应该突出显示。

我想学习这个,这不是我用现成的插件无法解决的事情......

提前致谢

4

1 回答 1

3

使用 RegExp 和preg_quote(负责处理正则表达式中使用的字符)。

function preg_quote( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: booeyOH
    // +   improved by: Ates Goral (http://magnetiq.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // *     example 1: preg_quote("$40");
    // *     returns 1: '\$40'
    // *     example 2: preg_quote("*RRRING* Hello?");
    // *     returns 2: '\*RRRING\* Hello\?'
    // *     example 3: preg_quote("\\.+*?[^]$(){}=!<>|:");
    // *     returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:'

    return (str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1");
}


$('.blah h3 a').each(function(){
    var text = $(this).text();
    var searched_text = 'ab la';
    var keywords = searched_text.split(' ');
    keywords = $.map(keywords, preg_quote);
    $(this).html(text.replace(new RegExp("(" + keywords.join('|') + ")" , 'gi'), "<b>$1</b>"));
});​

这将按空格打破搜索查询并用 < b >包装每个匹配项

演示(JSFiddle)

于 2013-01-04T19:56:18.750 回答