【发布时间】:2025-12-03 05:00:02
【问题描述】:
我的 jQuery 过滤器相互覆盖时遇到问题。例如,如果我想查看男士和女士,男士匹配项目 #1 并将其设置为显示,但随后将其设置为隐藏,因为女士不在带有 $.inArray(filter.value, item.data("attributes")) == -1 的数据属性中。有没有办法比较 2 个数组(一个是选择的过滤器,另一个是 item.data("attributes"))并显示具有一个或多个匹配项的不同项目。 (即我想要蓝色或红色的男士和女士时装)
$('.filter').on('click', function() {
filters = $('.filter:checked');
if (filters.length == 0)
$('.list-o-glasses').show();
else {
$('.list-o-glasses').hide();
$('.list-o-glasses').each(function(index, val) {
var item = $(this);
var show = true;
$(filters).each(function(i, filter) {
if ($.inArray(filter.value, item.data("attributes")) == -1) {
show = false;
}
});
if (show)
$('#' + $(item).attr("id")).show();
else
$('#' + $(item).attr("id")).hide();
});
}
});\
这是呈现的 HTML:
<div class="row shop-grid grid-view">
<div class="col-lg-4 col-md-6 list-o-glasses" id="BSG034BN" data-attributes="["men","wayfarer","metal","145","135","brown","brown"]" style="display: block;">
</div>
</div>
谢谢,如果您有任何想法,请告诉我!
【问题讨论】:
-
看不到您的 HTML,但是如果您只删除 else hide 语句,它会起作用吗?
else $('#' + $(item).attr("id")).hide(); -
您的
$(filters).each(看起来不对...您已经将filters定义为 jQuery 对象,那么为什么还要将它传递给 $() 呢? -
@jas7457 - 你是对的,我删除了过滤器变量周围的 $()
-
@andi - 删除 else 它仍然隐藏。其余的项目。我添加了 JS 使用的 html 元素。
-
您的程序中有逻辑错误。您将它们全部打开,然后迭代它们,然后检查每个过滤器是否匹配...首先过滤器得到匹配,显示仍然为真,但下一个过滤器,没有匹配,您将显示设置为假。删除 if(show) 上的 else,如果在过滤器上得到匹配,则中断循环,您不需要再检查任何过滤器,然后迭代到下一个项目
标签: javascript jquery filtering