【问题标题】:Search filter by data按数据搜索过滤
【发布时间】:2012-12-04 08:14:10
【问题描述】:

我尝试使用 jQuery/HTML 选择器来过滤数据,例如

$("li[data-filter*='keyword']")

但这不能过滤得到相同的结果 "keyword1 keyword2""keyword2 keyword1" ,你明白吗?

我会给你演示..

HTML:

<input>

<li data-filter="apple pie gummi bears gummi bears john">
    Apple pie gummi bears gummi bears John
</li>

<li data-filter="oat cake chocolate bar chupa chups dessert tootsie">
    Oat cake chocolate bar chupa chups dessert tootsie
</li>
<li data-filter="jujubes cookie sugar plum lemon drops candy">
    Jujubes cookie sugar plum lemon drops candy
</li>

jQuery :

var filter_timer;
$("input").keypress(function() {
    clearTimeout(filter_timer);
    filter_timer=setTimeout(function(){
        filter();
    },500);
});

function filter() {

var keyword = $("input").val();

if($("li[data-filter*='"+keyword+"']").length) {
    $("li").animate({opacity:0.4}).css({"text-decoration":"line-through"});
    $("li[data-filter*='"+keyword+"']").animate({opacity:1}).css({"text-decoration":"blink"});
}else{
    $("li").animate({opacity:1},function(){$("li").removeAttr("style")});}
}

游乐场: http://jsfiddle.net/9eaXD/

当我搜索 apple piepie appleapple gummi pei

时如何获得相同的结果

【问题讨论】:

    标签: jquery search filter selector


    【解决方案1】:

    使用属性选择器无法完成您尝试做的事情。 [data-filter*="apple pie"] 仅匹配data-filter 属性包含恰好字符串apple pie 的元素。

    您应该改用.filter()

    $("input").keypress(function() {
        var keywords = $(this).val().split(' ');
    
        $('li').removeClass('matched');
        $("li[data-filter]").filter(function() {
            var filters = $(this).data('filter').split(' ');
    
            for (var i = 0; i < keywords.length; i++) {
                var keyword = keywords[i];
    
                if (filters.indexOf(keyword) == -1) {
                    return false;
                }
            }
    
            return true;
        }).addClass('matched');
    });​
    

    演示:http://jsfiddle.net/9eaXD/8/

    您可以通过在页面加载时为每个元素创建 filters 数组来进一步优化:

    $("li[data-filter]").filter(function() {
        var $this = $(this);
    
        $this.data('filter', $this.data('filter').split(' '));
    });
    

    【讨论】:

    • 感谢filter(),但您的代码在搜索apple(一个关键字)时出现了小问题,因此无法显示任何结果。但是当搜索apple (带空格)时,我得到了结果
    • @l2aelba:那是因为它只在keypress 上运行。将其更改为 keyup 即可正常工作:jsfiddle.net/9eaXD/9
    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多