I think the two most straightforward approaches would be on click of any of the filter checkboxes either:
-
Hide all
<div>
elements, then loop through the checkboxes and for each checked one.show()
the<div>
elements with the associated category. -
Loop through all checkboxes to make a list of the classes to be shown, then loop through the
<div>
elements, checking each one to see if it has one of those classes and.hide()
or.show()
as appropriate.
Is there some general selector you can use to get all the <div>
elements? Do they have a particular container element, like how all the checkboxes are descendents of “#filters”?
// Solution 1
$("#filters :checkbox").click(function() {
$("div").hide();
$("#filters :checkbox:checked").each(function() {
$("." + $(this).val()).show();
});
});
Demo: http://jsfiddle.net/6wYzw/41/
// Solution 2
$("#filters :checkbox").click(function() {
var re = new RegExp($("#filters :checkbox:checked").map(function() {
return this.value;
}).get().join("|") );
$("div").each(function() {
var $this = $(this);
$this[re.source!="" && re.test($this.attr("class")) ? "show" : "hide"]();
});
});
Demo: http://jsfiddle.net/6wYzw/42/
I guess the first way is shorter, and easier to maintain…