私のjQueryフィルタが互いにオーバーライドするのに問題があります。たとえば、メンズとレディースを見たい場合、メンズはアイテム#1に一致し、表示するように設定しますが、女性は$.inArray(filter.value, item.data("attributes")) == -1
のデータ属性にないため、非表示に設定します。 2つの配列を比較する方法があります(1つは選択されたフィルタであり、もう1つはitem.data( "属性")です)、1つ以上の一致を持つ別個の項目を表示します。'OR'ではなく 'AND'でJSをフィルタリングします
$('.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を見ることはできませんが、あなただけの他の非表示文を削除した場合、それが働くだろうか? – andi
あなたの '$(filters).each('は間違っています...あなたはすでに 'filters'を次のように定義しています:' $(items) '.attr(" id ")) – jas7457
@ jas7457 - あなたが正しいですし、フィルタ変数を囲む$()を削除しました。 –