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

发布于 2024-12-23 09:09:43 字数 821 浏览 1 评论 0原文

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));

这将基于过滤列表如果您输入的内容与列表中单词的任何部分匹配,则打开。我试图让它只匹配整个单词,所以在输入完整单词之前它不会说它有匹配项。正则表达式会是最好的吗?或者?我需要帮助,我尝试过的方法都没有效果。

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));

This will filter the list based on if what you've typed matches ANY part of a word in the list. I'm trying to make it only match whole words, so it wont say it has a match until the full word is typed. Would Regex be best? Or? I need help, nothing I've tried has worked.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

空城缀染半城烟沙 2024-12-30 09:09:44

您可以使用已经提到的 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/

You can make use of the filter method as already mentioned. Or you can easily extend jQuery with your own custom filter which is great way to reuse code.

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

and now use it like you would do with any other built-in filter :containsWord('Some word').
See http://jsfiddle.net/U8T8p/9/

↙温凉少女 2024-12-30 09:09:44

尝试这样的事情: 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();

Try something like this: 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();
醉殇 2024-12-30 09:09:44

您可以使用 .filter 检查文本并将这些元素向下滑动,并将这些元素作为 jQuery 对象传递给 .not 以使其他元素向上滑动:< a href="http://jsfiddle.net/U8T8p/8/" rel="nofollow">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));

You can use .filter to check the texts and slide these elements down, and pass these elements as a jQuery object to .not to get the other elements to slide up: 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));
千と千尋 2024-12-30 09:09:43

像这样的东西: 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”后,您仍然会匹配“United States”。您可以通过更改为 RegExp('\\b' + a + '\\b', i) 使其匹配完整单词。

Something like this: 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();

The regex limits matches to those where the currently entered text starts at a word boundary. So, having typed 'Stat' you'd still match 'United States'. You can make it match a full word by changing to RegExp('\\b' + a + '\\b', i).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文