我正在尝试为商店整理一个简单的jQuery产品过滤器,该商店在一个页面上列出了所有类别的产品。由于商店的设置方式,这无法通过AJAX实现。
简单地说,该类别的所有产品都在一页上。他们拥有不同品牌的产品名称和团队名称。标记看起来像这样(最后的表格是我计划进行过滤的方式)。
<div id="CategoryContent">
<ul>
<li class="product">Brand1 PRODUCT1 TeamA</li>
<li class="product">Brand1 PRODUCT2 TeamB</li>
<li class="product">Brand2 PRODUCT3 TeamB</li>
<li class="product">Brand2 PRODUCT4 TeamC</li>
<li class="product">Brand3 PRODUCT5 TeamA</li>
<li class="product">Brand3 PRODUCT6 TeamD</li>
<li class="product">Brand4 PRODUCT7 TeamD</li>
<li class="product">Brand1 PRODUCT8 TeamA</li>
<li class="product">Brand1 PRODUCT9 TeamA</li>
<li class="product">Brand1 PRODUCT10 TeamB</li>
<li class="product">Brand4 PRODUCT11 TeamD</li>
<li class="product">Brand2 PRODUCT12 TeamA</li>
</ul>
<div style="clear:both;"></div>
<div class="filter">
<form id= "brandfilter" action="">
<h2>Brands:</h2>
<input type="checkbox" name="brand" value="Brand1"/>Brand1 </br>
<input type="checkbox" name="brand" value="Brand2"/>Brand2 </br>
<input type="checkbox" name="brand" value="Brand3"/>Brand3 </br>
<input type="checkbox" name="brand" value="Brand1"/>Brand4 </br>
</form>
<form id="teamfilter" action="">
<input type="checkbox" name="team" value="TeamA"/>TeamA </br>
<input type="checkbox" name="team" value="TeamB"/>TeamB </br>
<input type="checkbox" name="team" value="TeamC"/>TeamC </br>
<input type="checkbox" name="team" value="TeamD"/>TeamD </br>
</form>
我发现这个过滤器可以正常工作。在控制台中用show替换hide,使用Brand2替换Brand1,TeamA等工作正常。
$("#CategoryContent li").not(
$("#CategoryContent li:contains(Brand1)")
).hide();
下一步是获得双重过滤器:
$("#CategoryContent li").not(
$("#CategoryContent li:contains(Brand1):contains(TeamA)")
).hide();
我的工作问题有两个方面。 1用变量替换Brand1 / Team A(因此是formids)。
第二个是在单击复选框时尝试运行脚本。如果点击任何一个并且两个都被点击(它意味着上面的脚本需要通过显示所有然后隐藏来重置),它应该工作。
目前要发起它我正在运行这个脚本,但我遇到了问题,所以我又回到了1个过滤器。
$("input:checkbox[name='brand']").click(function() {
var brandfilter = $(this).val();
alert (brandfilter);
$("#CategoryContent li:contains(' + brandfilter + ')").parent().hide();
});
弹出的警报就是我想要的(即Brand1),但之后的隐藏功能不起作用,当我再次在控制台alert (brandfilter)
时,我得到[object HTMLFormElement]
。所以我认为变量没有正确存储或什么?
这是简单的工作基本脚本http://jsfiddle.net/7gYJc/
答案 0 :(得分:1)
假设您要显示与当前选中的任何一个框相匹配的项目,您可以使用:
$('input:checkbox').change(showHideProducts);
function showHideProducts()
{
var checked = $('input:checked');
var products = $('.product');
// If all the boxes are unchecked, show all the products.
if (checked.length == 0)
{
products.show();
}
else
{
products.hide();
checked.each
(
function()
{
$('.product:contains("' + $(this).val() + '")').show();
}
);
}
}
编辑:由于您希望在未选中任何内容时显示所有框,只需添加if(长度= 0)检查并在其中显示所有内容(参见上文)。
答案 1 :(得分:0)
我无法确定问题所在,但您可以尝试使用filter()
代替:contains
选择器。使用filter()
,您可以创建自己的自定义过滤规则,因为它将函数作为参数。
var myProducts = function (brand, team) {
brand = brand || '';
team = team || '';
return $('.product').filter(function () {
var re = new RegExp(brand + '.+' + team, 'i');
return re.test($(this).text());
});
};
myProducts('Brand1', 'TeamA').hide();
myProducts('Brand2').hide();
答案 2 :(得分:0)
我想出了以下方法:
从选中的所有复选框开始,因为您要显示所有产品。如果用户取消选中复选框,则应隐藏与该品牌/团队匹配的产品。
这是我的代码:
var $filters = $("input:checkbox[name='brand'],input:checkbox[name=team]").prop('checked', true); // start all checked
var $categoryContent = $('#CategoryContent li'); // cache this selector
$filters.click(function() {
// if any of the checkboxes for brand or team are checked, you want to show LIs containing their value, and you want to hide all the rest.
$categoryContent.hide();
$filters.filter(':checked').each(function(i, el) {
$categoryContent.filter(':contains(' + el.value + ')').show();
});
});
答案 3 :(得分:0)
本周我有同样的问题,多次选择。选择器工作正常,但隐藏不起作用。我能够使用
解决它.css('visibility', 'hidden'); // instead of .hide() and
.css('visibility', ''); // instead of .show()
我不明白,但它奏效了。