如何使一个简单的jQuery过滤器列表只接受整个单词,因此它不匹配部分单词,只匹配整个单词

时间:2011-12-31 15:29:54

标签: javascript jquery regex word match

http://jsfiddle.net/nicktheandroid/U8T8p/4/

(function($) {

    $('.filterinput').keyup(function() {
        var filter = $(this).val();
        if (filter.length > 2) {
            // this finds all links in the list that contain the input,
            // and hide the ones not containing the input while showing the ones that do
            $(list).find("a:not(:Contains(" + filter + "))").parent().slideUp();
            $(list).find("a:Contains(" + filter + ")").parent().slideDown();
        } else {
            $(list).find("li").slideDown();
        }
        return false;
    })

}(jQuery));

这将根据您输入的内容是否与列表中某个单词的任何部分匹配来过滤列表。我试图让它只匹配整个单词,所以它不会说它有匹配,直到输入完整的单词。 Regex会是最好的吗?要么?我需要帮助,我尝试过的任何工作都没有。

4 个答案:

答案 0 :(得分:2)

您可以使用已经提到的filter方法。或者,您可以使用自己的自定义过滤器轻松扩展jQuery,这是重用代码的好方法。

$.expr[':'].containsWord = function(elem, index, match) {
    var text = $(elem).text();
    return !!text.match(new RegExp('\\b' + match[3] + '\\b'));
};

现在就像使用任何其他内置过滤器:containsWord('Some word')一样使用它。 见http://jsfiddle.net/U8T8p/9/

答案 1 :(得分:2)

像这样:http://jsfiddle.net/U8T8p/10/

        var containing = $('#list li').filter(function () {
            var regex = new RegExp('\\b' + a, 'i');
            return regex.test($('a', this).text());
        }).slideDown();
        $('#list li').not(containing).slideUp();

正则表达式限制匹配当前输入的文本从单词边界开始的那些。所以,输入“Stat”后你仍然会匹配“美国”。您可以通过更改为RegExp('\\b' + a + '\\b', i)来匹配完整的字词。

答案 2 :(得分:1)

尝试这样的事情:http://jsfiddle.net/U8T8p/5/

$(list).find("a").filter(function() { return $(this).text() != filter; }).parent().slideUp();
$(list).find("a").filter(function() { return $(this).text() === filter; }).parent().slideDown();

答案 3 :(得分:1)

您可以使用.filter检查文本并向下滑动这些元素,并将这些元素作为jQuery对象传递给.not,以使其他元素向上滑动:http://jsfiddle.net/U8T8p/8/

(function($) {

    $('.filterinput').keyup(function() {
        var filter = $(this).val();
        if (filter.length > 2) {
            var a = $(list).find("a");

            var x = a.filter(function() {
                return $(this).text() === filter;
            });

            x.parent().slideDown();

            a.not(x).parent().slideUp();
        } else {
            $(list).find("li").slideDown();
        }
        return false;
    })

}(jQuery));