Проблема заключается в (1) в том, как вы решаете, какие .productsBox
элементы отображать, и (2) в том, что вы применяете .filter().show()
внутри своей функции .each()
.
Вместо этого,Вы должны создать полное условие фильтра, просматривая отмеченные элементы: , затем применить фильтр + шоу.Кроме того, по крайней мере, основываясь на данных вашего примера, вы должны использовать «Атрибут содержит селектор слов» ( документация ), который равен ~=
вместо селектора содержит *=
.Первый из них гарантирует, что option_10
будет отличаться от option_1
в вашем фильтре data-tag
.
Полный рабочий JS:
$(function() {
$("input").on("change", function() {
var $checked = $("input:checked");
var $checkedFilter = '';
if ($checked.length) {
$(".productsBox").hide();
$checked.each(function() {
$checkedFilter = $checkedFilter + '[data-tag~="' + $(this).val() + '"]';
});
$(".productsBox").filter($checkedFilter).show();
} else {
$(".productsBox").show();
}
});
});
Вы можете видеть, что я создаю новую строкупеременная заранее называется checkedFilter
;Здесь мы создадим динамический фильтр, для которого нужно показать .productsBox
элементов.Затем, перебирая отмеченные флажки, мы строим полный фильтр на основе этих элементов.В примере проверяемых Option 1
и Option 4
значение checkedFilter
равно: [data-tag~="option_1"][data-tag~="option_4"]
.
Затем вне каждого цикла проверяемых элементов мы вызываем .filter(checkedFilter).show()
, используя checkedFilter
переменная.
Рабочий CodePen здесь: https://codepen.io/anon/pen/xzZEmd
Если вы выбираете Опции 1 и 4, появляется только Product 2
;если затем выбрать в качестве третьего варианта вариант 3, элементы продукта не отображаются, поскольку ни один из них не имеет 1, 3 и 4. При выборе 1, 2 и 3 отображается только Product 1
и т. д.