2012-12-03 19 views
6

Sto provando a rendere un elenco di prodotti filtrabili utilizzando le checkbox e jQuery. Ho del codice funzionante (grazie alle risposte precedenti che ho trovato qui).jQuery multiple gruppi di filtri checkbox

Desidero utilizzare le classi CSS per mostrare o nascondere elementi.

Sto cercando di filtrare gli articoli per colore, finitura e prezzo e il problema è che il mio codice sta attualmente selezionando gli elementi usando OR tra i diversi gruppi di filtri.

Devo essere in grado di filtrare usando OR all'interno di ciascun gruppo (ad es. Colore) ma con AND quando le caselle di controllo sono in gruppi diversi. Il modo in cui voglio farlo è aggiungendo un '.' tra i nomi delle classi, quindi l'elemento corrisponderà al filtro solo se le classi css di colore AND finish AND price sono abbinate.

esempio # div.dark.smooth.b

Ho provato questo in console Firebug e posso filtrare gli elementi di cui ho bisogno in questo modo, ma purtroppo non so come raggiungere questo in jQuery. Il mio codice è sotto ...

<!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

cercare di evitare gli spazi vuoti nei valori di classe. – arulmr

+0

Idea veloce: invece di usare direttamente slideDown, metti i risultati in un array in modo da avere 3 array, uno per categoria (uno sarà ad esempio [dark, light] e l'altro [smooth, riven] e così via ...). Quindi crea i tuoi selettori semplicemente mescolando gli array: dark.smooth, dark.riven, light.smooth, light.riven, ecc. Ecc. – Tallmaris

+1

Al tuo tag 'script' per favore aggiungi attributo' type = "text/javascript" 'per evitare problemi in alcune situazioni. –

risposta

1

OK - ho capito male classe CSS, prova a incollare questo appena sotto la funzione di clic casella di controllo e vi darà un puntatore su come fare questo ..

 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

Grazie Grant per i vostri suggerimenti. –

+0

Grazie Grant: è una soluzione perfetta e di facile manutenzione. –

1

Sostituire i singoli occhielli con anelli nidificati.

EDIT: Si dovrà anche verificare la presenza di ogni condizione:

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

Grazie per la risposta. La prima parte funziona ma non voglio che l'utente debba fare clic in tutti e 3 i gruppi. Quando aggiungo la seconda e la terza parte, i filtri non sembrano funzionare come previsto. –

+0

Grazie mille. Funziona perfettamente! –

0

ne dite di usare la funzione .Click per le caselle di controllo per ottenere il valore associato di tutti controllati caselle di controllo sulla pagina e costruire il vostro stringa di classe da quella cioè dark.riven.b.light.a - funzionerebbe?

+0

No perché ci sarà una sola classe per ogni gruppo che ha una checkbox nella stringa di classe. –

0

Poiché solo un singolo elemento di un gruppo è/dovrebbe essere selezionato, i pulsanti di opzione sembrano appropriati, il trucco è quindi semplicemente spegnerlo se è attivo e cliccato.

Ho modificato leggermente il codice e aggiunto del codice per riflettere la possibilità di "deselezionare" un pulsante di opzione. esempio funzionante violino: http://jsfiddle.net/MarkSchultheiss/mBAaW/

Radio selezione multipla

<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> 

codice di esempio:

// 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

Grazie Marco per i tuoi suggerimenti. Avevo bisogno di una soluzione in cui poter fare più scelte in ogni gruppo. Un esempio pienamente funzionante è stato fornito da Grant Roy, quindi l'ho selezionato come la migliore risposta. –