2012-12-03 146 views
6

我想使用复选框和jQuery过滤产品列表。我有一些代码工作(感谢我以前在这里找到的答案)。jQuery多个复选框过滤器组

我想使用CSS类来显示或隐藏项目。

我想通过颜色,完成和价格筛选项目,问题是我的代码当前正在使用不同筛选器组之间的OR选择项目。

我需要能够在每个组中使用OR(例如颜色)进行过滤,但当复选框位于不同组中时使用AND进行过滤。我想这样做的方式是添加一个'。'之间的类名称,所以该项目将只匹配过滤器,如果颜色和完成AND价格CSS类匹配。

例如#div.dark.smooth.b

我已经在Firebug的控制台尝试这样做,我可以过滤我需要这样的项目,但不幸的是,我不知道如何在jQuery的做到这一点。我的代码如下...

<!DOCTYPE html> 
<html> 
<head> 
<script src="http://code.jquery.com/jquery-latest.js"></script> 
</head> 
<body> 

<ul id="colour"> 
<li><input type="checkbox" name="colour" value="dark"> Dark</li> 
<li><input type="checkbox" name="colour" value="medium"> Medium</li> 
<li><input type="checkbox" name="colour" value="light"> Light</li> 
</ul> 

<ul id="finish"> 
<li><input type="checkbox" name="finish" value="smooth"> Smooth</li> 
<li><input type="checkbox" name="finish" value="riven"> Riven</li> 
<li><input type="checkbox" name="finish" value="honed"> Honed</li> 
</ul> 

<ul id="price"> 
<li><input type="checkbox" name="price" value="a"> Up to £25</li> 
<li><input type="checkbox" name="price" value="b"> £25 to £45</li> 
<li><input type="checkbox" name="price" value="c"> £45 to £65</li> 
<li><input type="checkbox" name="price" value="d"> £65 to £85</li> 
<li><input type="checkbox" name="price" value="e"> over £85</li> 
</ul> 

<div class="dark smooth b">dark smooth b</div> 
<div class="medium honed d">medium honed d</div> 
<div class="dark smooth d">dark smooth d</div> 
<div class="light smooth b">light smooth b</div> 
<div class="light riven b">light riven b</div> 
<div class="dark riven c">dark riven c</div> 
<div class="medium riven a">medium riven a</div> 

<script> 

$("#colour :checkbox,#finish :checkbox,#price :checkbox").click(function() { 

     $("div").hide(); 

     $("#colour :checkbox:checked").each(function() { 
      $("." + $(this).val()).slideDown('slow'); 
     }); 
     $("#finish :checkbox:checked").each(function() { 
      $("." + $(this).val()).slideDown('slow'); 
     }); 
     $("#price :checkbox:checked").each(function() { 
      $("." + $(this).val()).slideDown('slow'); 
     }); 

    }); 

</script> 
</body> 
</html> 
+0

尽量避免在类值空的空间。 – arulmr

+0

快速构思:不是直接使用slideDown,而是将结果放在一个数组中,以便您有3个数组,每个类别一个(例如[黑暗,光亮]和其他[平滑,撕裂]等等...... )。然后通过混合数组来创建你的选择器:dark.smooth,dark.riven,light.smooth,light.riven等等。 – Tallmaris

+1

为了避免你的'script'标签添加属性'type =“text/javascript”'以避免在某些情况下的问题。 –

回答

1

行 - 我误解了CSS类,尝试粘贴此仅低于你的复选框点击功能,它会给你如何做到这一点的指针..

 var ColorArray = []; 
     var FinishArray = []; 
     var PriceArray = []; 

     ColorArray[0] = "Dark"; 
     ColorArray[1] = "Medium"; 

     FinishArray[0] = "Smooth"; 
     FinishArray[1] = "Riven"; 

     PriceArray[0] = "a"; 
     PriceArray[1] = "b"; 
     PriceArray[2] = "c"; 



     for (c = 0; c < ColorArray.length ; c++) { 
      for (f = 0; f < FinishArray.length ; f++) { 
       for (p = 0; p < PriceArray.length ; p++) { 
           alert(ColorArray[c] +"."+ FinishArray[f] + "."+PriceArray[p]); 
       } 
      } 
     } 

     }) 

EDIT - the full working solution based on the above method [with 4 select options now] is pasted below. 


    <!DOCTYPE html> 
<html> 
<head> 
    <script src="http://code.jquery.com/jquery-latest.js"></script> 
</head> 
<body> 

    <ul id="filter1"> 
     <li> 
      <input type="checkbox" name="filter1" value="dark"> 
      Dark</li> 
     <li> 
      <input type="checkbox" name="filter1" value="medium"> 
      Medium</li> 
     <li> 
      <input type="checkbox" name="filter1" value="light"> 
      Light</li> 
    </ul> 

    <ul id="filter2"> 
     <li> 
      <input type="checkbox" name="filter2" value="sm"> 
      Small</li> 
     <li> 
      <input type="checkbox" name="filter2" value="med"> 
      Medium</li> 
     <li> 
      <input type="checkbox" name="filter2" value="lge"> 
      Large</li> 
    </ul> 

    <ul id="filter3"> 
     <li> 
      <input type="checkbox" name="filter3" value="smooth"> 
      Smooth</li> 
     <li> 
      <input type="checkbox" name="filter3" value="riven"> 
      Riven</li> 
     <li> 
      <input type="checkbox" name="filter3" value="honed"> 
      Honed</li> 
    </ul> 

    <ul id="filter4"> 
     <li> 
      <input type="checkbox" name="filter4" value="a"> 
      Up to £25</li> 
     <li> 
      <input type="checkbox" name="filter4" value="b"> 
      £25 to £45</li> 
     <li> 
      <input type="checkbox" name="filter4" value="c"> 
      £45 to £65</li> 
     <li> 
      <input type="checkbox" name="filter4" value="d"> 
      £65 to £85</li> 
     <li> 
      <input type="checkbox" name="filter4" value="e"> 
      over £85</li> 
    </ul> 

    <p><a class="showall" href="#" />Clear Filters</a></p> 

    <div class="list dark sm smooth b">dark small smooth b</div> 
    <div class="list medium lge honed d">medium large honed d</div> 
    <div class="list dark med smooth d">dark medium smooth d</div> 
    <div class="list light sm smooth b">light small smooth b</div> 
    <div class="list light lge riven b">light large riven b</div> 
    <div class="list dark sm riven c">dark small riven c</div> 
    <div class="list medium med riven a">medium medium riven a</div> 
    <div class="list medium lge honed e">medium large honed e</div> 

    <div class="NoResults"></div> 

    <script> 

     $("#filter1 :checkbox,#filter2 :checkbox,#filter3 :checkbox,#filter4 :checkbox").click(function() { 

      $("div.list").hide(); 

      var Filter1Array = []; 
      var Filter2Array = []; 
      var Filter3Array = []; 
      var Filter4Array = []; 
      var filter1_Count = 0, filter2_Count = 0, filter3_Count = 0, filter4_Count = 0; 

      $("#filter1 :checkbox:checked").each(function() { 
       Filter1Array[filter1_Count] = $(this).val(); 
       filter1_Count++ 
      }); 

      $("#filter2 :checkbox:checked").each(function() { 
       Filter2Array[filter2_Count] = $(this).val(); 
       filter2_Count++ 
      }); 

      $("#filter3 :checkbox:checked").each(function() { 
       Filter3Array[filter3_Count] = $(this).val(); 
       filter3_Count++ 
      }); 

      $("#filter4 :checkbox:checked").each(function() { 
       Filter4Array[filter4_Count] = $(this).val(); 
       filter4_Count++ 
      }); 

      var filter1string 
      var filter2string 
      var filter3string 
      var filter4string 

      var filter1checked = false 
      var filter2checked = false 
      var filter3checked = false 
      var filter4checked = false 

      if (filter1_Count == 0) { filter1_Count = 1; } else { filter1checked = true; } 
      if (filter2_Count == 0) { filter2_Count = 1; } else { filter2checked = true; } 
      if (filter3_Count == 0) { filter3_Count = 1; } else { filter3checked = true; } 
      if (filter4_Count == 0) { filter4_Count = 1; } else { filter4checked = true; } 

      for (f1 = 0; f1 < filter1_Count; f1++) { 

       if (Filter1Array[f1] != null) { filter1string = '.' + Filter1Array[f1] } else { filter1string = '' } 

       for (f2 = 0; f2 < filter2_Count; f2++) { 

        if (Filter2Array[f2] != null) { filter2string = '.' + Filter2Array[f2] } else { filter2string = '' } 

        for (f3 = 0; f3 < filter3_Count; f3++) { 

         if (Filter3Array[f3] != null) { filter3string = '.' + Filter3Array[f3] } else { filter3string = '' } 

         for (f4 = 0; f4 < filter4_Count; f4++) { 

          if (Filter4Array[f4] != null) { filter4string = '.' + Filter4Array[f4] } else { filter4string = '' } 

          var QueryString = filter1string + filter2string + filter3string + filter4string 
          $(QueryString).fadeIn('fast'); 
         } 
        } 
       } 
      } 

      if (!filter1checked && !filter2checked && !filter3checked && !filter4checked) { 
       $("div.list").fadeIn('fast'); 
      }; 

      if ($('div.list:visible').length === 0) { 
       $(".NoResults").html("<p class='error'>No products match your filter selections. Please try a different combination.</p>"); 
      } 
      else { $(".NoResults").html(""); } 

     }); 

     $('a.showall').click(function() { 
      $("div.list").fadeIn('fast'); 
      $("#filter1 :checkbox").removeAttr('checked'); 
      $("#filter2 :checkbox").removeAttr('checked'); 
      $("#filter3 :checkbox").removeAttr('checked'); 
      $("#filter4 :checkbox").removeAttr('checked'); 
      $(".NoResults").html(""); 
      return false; 
     }); 

    </script> 
</body> 
</html> 
+0

谢谢授予您的建议。 –

+0

谢谢格兰特 - 这是一个完美的解决方案,易于维护。 –

1

用嵌套循环替换单个循环。

编辑:您还必须检查每一个条件:

var fc=false; 
    var ff=false; 
    var fp=false; 
    $("#colour :checkbox:checked").each(function() { 
     fc=true; 
     var color = $(this).val(); 
     $("#finish :checkbox:checked").each(function() { 
      ff=true; 
      var finish = $(this).val(); 
      $("#price :checkbox:checked").each(function() { 
       fp=true; 
       $("." + color + "." + finish + "." + $(this).val()).slideDown('slow'); 
      }); 
      if(!fp) { 
       $("." + color + "." + finish).slideDown('slow'); 
      } 
     }); 
     if(!ff) { 
      $("#price :checkbox:checked").each(function() { 
       fp=true; 
       $("." + color + "." + $(this).val()).slideDown('slow'); 
      }); 
      if(!fp) { 
       $("." + color).slideDown('slow'); 
      } 
     } 
    }); 
    if(!fc) { 
     $("#finish :checkbox:checked").each(function() { 
      ff = true; 
      var finish = $(this).val(); 
      $("#price :checkbox:checked").each(function() { 
       fp=true; 
       $("." + finish + "." + $(this).val()).slideDown('slow'); 
      }); 
      if(!fp) { 
       $("." + finish).slideDown('slow'); 
      } 
     }); 
     if(!ff) { 
      $("#price :checkbox:checked").each(function() { 
       $("." + $(this).val()).slideDown('slow'); 
      }); 
     } 
    } 
+0

谢谢您的回答。第一部分工作,但我不希望用户必须点击所有3组。当我添加第二部分和第三部分时,过滤器看起来不像预期的那样工作。 –

+0

非常感谢。这很好用! –

0

如何使用。点击功能的复选框来获取所有的相关值检查页面上的复选框,并建立自己的从那个类的字符串,即dark.riven.b.light.a - 会工作吗?

+0

否,因为每个组中只有一个类在类字符串中有一个复选框。 –

0

由于只有一组单一的产品/会被选中,单选按钮看起来是合适的,然后只要打开一个关闭点击就可以了。

我稍微改变了标记并添加了代码以反映“取消”单选按钮的能力。工作示例小提琴:http://jsfiddle.net/MarkSchultheiss/mBAaW/

广播多选

<div id="myRadios"> 
<ul id="colour"> 
    <li><label><input type="radio" name="colour" value="dark" >Dark</label></li> 
    <li><label><input type="radio" name="colour" value="medium">Medium</label></li> 
    <li><label><input type="radio" name="colour" value="light">Light</label></li> 
</ul> 

<ul id="finish"> 
<li><input type="radio" name="finish" value="smooth">Smooth</li> 
<li><input type="radio" name="finish" value="riven">Riven</li> 
<li><input type="radio" name="finish" value="honed">Honed</li> 
</ul> 

<ul id="price"> 
<li><input type="radio" name="price" value="a">Up to £25</li> 
<li><input type="radio" name="price" value="b">£25 to £45</li> 
<li><input type="radio" name="price" value="c">£45 to £65</li> 
<li><input type="radio" name="price" value="d">£65 to £85</li> 
<li><input type="radio" name="price" value="e">over £85</li> 
</ul></div> 
<div id="founditems"> 
<div class="dark smooth b">dark smooth b</div> 
<div class="medium honed d">medium honed d</div> 
<div class="dark smooth d">dark smooth d</div> 
<div class="light smooth b">light smooth b</div> 
<div class="light riven b">light riven b</div> 
<div class="dark riven c">dark riven c</div> 
<div class="medium riven a">medium riven a</div> 
</div> 
<div id="shower">empty</div> 

示例代码:

// radio multi-select 
var mycolors = []; 
var myfinish = []; 
var myprice = []; 

function checkit(myarray, myclass) { 
    var indisun = $.inArray(myclass, myarray); 
    return indisun; 
} 
$("#colour,#finish,#price").on("click", ":radio", function(event) { 

    $("#founditems div").hide(); 
    var mytarget = event.target; 
    $("#shower").text(""); 
    if ($(mytarget).hasClass("iam")) { 
     $(mytarget).parents("ul").find("input:radio").removeClass("iam"); 
     mytarget.checked = false; 
    } else { 
     $(mytarget).parents("ul").find("input:radio").removeClass("iam"); 
     $(mytarget).addClass("iam"); 
    }; 
    var mycurrent = []; 
    var hasColor = $("#colour :radio:checked"); 
    var hasFinish = $("#finish :radio:checked"); 
    var hasPrice = $("#price :radio:checked"); 

    var radios = $("#colour :radio,#finish :radio,#price :radio"); 
    radios.filter(":checked").each(function() { 
     var disun = $(this).val(); 
     mycurrent.push(disun); 
    }); 
    $("#founditems div").removeClass("iam"); 

    $('#founditems div').each(function() { 
     var adiv = $(this); 
     $.each(mycurrent, function() { 
      if (adiv.hasClass(this)) { 
       adiv.addClass("iam"); 
      }; 
     }); 
    }); 
    //just to show current selection(s) 
    $.each(mycurrent, function() { 
     $("#shower").text($("#shower").text() + this); 
    }); 
    var currCol = hasColor.length ? hasColor.val() : false; 
    var currFin = hasFinish.length ? hasFinish.val() : false; 
    var currPri = hasPrice.length ? hasPrice.val() : false; 
    $.each(mycurrent, function() { 
     var currVal = this; 
     var itsaColor = checkit(mycolors, this); 
     var itsaFinish = checkit(myfinish, this); 
     var itsaPrice = checkit(myprice, this); 
     $('#founditems div').each(function() { 
      var adiv = $(this); 
      if (adiv.hasClass(currVal)) { 
       if (currCol && !adiv.hasClass(currCol) && itsaColor) { 
        adiv.removeClass("iam"); 
       } 
       if (currFin && !adiv.hasClass(currFin) && itsaFinish) { 
        adiv.removeClass("iam"); 
       }; 
       if (currPri && !adiv.hasClass(currPri) && itsaPrice) { 
        adiv.removeClass("iam"); 
       }; 
      } 
     }); 
    }); 

    $('#founditems div.iam').slideDown("slow"); 
}); 
+0

谢谢马克的建议。我需要一个可以在每个组中进行多种选择的解决方案。 Grant Roy提供了一个完整的实例,所以我选择了这个最好的答案。 –