2015-06-03 3 views
7

Dopo aver provato varie soluzioni trovate qui e sul resto del web, non riesco a capire la logica per farlo in modo "semplice" (o farlo funzionare del tutto).Come posso filtrare un elenco con più valori usando jQuery e CSS?

Ho la seguente lista:

<ul class="store-list"> 
    <li data-categories="Bags Shoes Accessories Belts"> 
     <h3 itemprop="name">Enzo Poli</h3> 
    </li> 
    <li data-categories="Womenswear Shoes"> 
     <h3 itemprop="name">Ilse Jacobsen</h3> 
    </li> 
    <li data-categories="Menswear Womenswear Shoes Ties"> 
     <h3 itemprop="name">Kiman (Shoes Ties)</h3> 
    </li> 
    <li data-categories="Menswear Womenswear Shoes Knitwear"> 
     <h3 itemprop="name">Riccovero</h3> 
    </li> 
</ul> 

<button class="a">Ties</button> 
<button class="b">Ties & Shoes</button> 
<button class="c">Menswear</button> 

Ho provato con Attribute Not Equal Selector, ma che sicuramente non funziona.

var stores = $('.store-list'); 

$('button.b').on('click', function(){ 
    stores.find('li[data-categories!="Ties"][data-categories!="Shoes"]').fadeOut(); 
}); 

Un altro problema è quando seleziono una categoria diversa, gli elementi nascosti non vengono visualizzati.

So che posso usare $.each() e passare attraverso ogni elemento e utilizzare un sacco di codice per vedere se contiene la categoria e controllare se è visibile o meno. Ma speravo solo che ci sarebbe stata un'alternativa migliore e più semplice.

Quindi la Q è; Come posso mostrare/nascondere le voci dell'elenco in base a quali filtri seleziono?
See my fiddle here.

+0

è atteso risultato per visualizzare un solo elemento 'li' a scatto di' button'? – guest271314

+0

No.Ho circa 13 categorie. Se seleziono 3 categorie, verranno mostrati tutti gli articoli con queste categorie. Tutto il resto dovrebbe essere nascosto. – Steven

+0

Prova a utilizzare '.filter()'; anche se potrebbe sostituire l'elemento 'data- *' a 'button' per testare con' button' '.innerHTML' – guest271314

risposta

6

Prova questo:

var stores = $('.store-list'); 
 

 
$('button.a').on('click', function() { 
 
    stores.find('li').not('[data-categories~="Ties"]').fadeOut(); 
 
    stores.find('li[data-categories~="Ties"]').fadeIn(); 
 
}); 
 

 
$('button.b').on('click', function() { 
 
    stores.find('li').not('[data-categories~="Ties"], [data-categories~="Shoes"]').fadeOut(); 
 
    stores.find('li[data-categories~="Ties"], [data-categories~="Shoes"]').fadeIn(); 
 
}); 
 

 
$('button.c').on('click', function() { 
 
    stores.find('li').not('[data-categories~="Menswear"]').fadeOut(); 
 
    stores.find('li[data-categories~="Menswear"]').fadeIn(); 
 
});
body { 
 
    font-size: 0.7em; 
 
} 
 
ul, 
 
li { 
 
    list-style: none; 
 
} 
 
a { 
 
    text-decoration: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<ul class="store-list"> 
 
    <li data-categories="Bags Shoes Accessories Belts"> 
 
    <h3 itemprop="name">Enzo Poli</h3> 
 
    </li> 
 
    <li data-categories="Womenswear"> 
 
    <h3 itemprop="name">Ilse Jacobsen</h3> 
 
    </li> 
 
    <li data-categories="Menswear Womenswear Shoes Ties"> 
 
    <h3 itemprop="name">Kiman (Shoes Ties)</h3> 
 
    </li> 
 
    <li data-categories="Menswear Womenswear Shoes Knitwear"> 
 
    <h3 itemprop="name">Riccovero</h3> 
 
    </li> 
 
</ul> 
 

 
<button class="a">Ties</button> 
 
<button class="b">Ties & Shoes</button> 
 
<button class="c">Menswear</button>

Come potete vedere io uso data~='item' invece di != in questo modo si controlla se contiene quella parola sui dati-attributo.

Inoltre, forzare la dissolvenza di quelli che hanno la categoria in modo che tutta la gestione sia fatta. Sicuramente c'è un modo migliore per farlo, ma questa è la logica predefinita.

+0

ora controlliamo se' data-categories' contiene 'A o B' usando' ~ = '. Come potrei andare se voglio avere "A e B"? – Steven

+0

@Steven rimuovere la virgola in '[data-categories ~ =" Ties "], [data-categories ~ =" Shoes "]' e usare '[data-categories ~ =" Ties "] [data-categories ~ =" Scarpe "]' e controlla 'A e B' mentre con la virgola controlla' A o B' –

+0

E 'quello che sto usando adesso ma seleziona qualsiasi negozio che abbia Menswear _or_ Shoes. Non scarpe da uomo e scarpe. – Steven

0

Non usare mai .fadeIn() - così, una volta scomparsi, sono spariti.

Nessuno delle schede catagories utilizza un singolo valore, in modo da controllare per = o != non darà mai una corrispondenza esatta, utilizzare ~= per abbinare parole:

https://api.jquery.com/attribute-contains-word-selector/

[Joel ha fornito risposta con il codice di , quindi fermarsi qui]

5

Penso che l'equivoco da biasimare qui sia che gli attributi data- * funzionano come le classi nella separazione di più valori per spazi. Non è così, qui state semplicemente impostando l'attributo arbtirary data-categories a una singola stringa contenente spazi, quindi provare a corrispondere su una determinata singola categoria probabilmente non funzionerà. Lì per lì, si potrebbe scorrere tutti gli elementi e pattern-abbinare il loro attributo data-categories contro il vostro obiettivo, come:

$('button.a').on('click', function(){ 
    stores.find('li').each(function() { 
     if($(this).attr("data-categories").split(" ").indexOf('Ties') == -1) { 
      $(this).fadeOut(); 
     } 
    }); 
}); 

Un approccio migliore potrebbe essere quella in classi di uso infatti invece di un attributo di dati, allora si può facilmente fare selezioni basate sul non avere una classe.

1

var stores = $('ul.store-list > li'); 
 

 
$('button.a').on('click', function(){ 
 
    stores.fadeIn(':hidden').not('li[data-categories~="Ties"]', stores).fadeOut(); 
 
}); 
 

 
$('button.b').on('click', function(){ 
 
    stores.fadeIn(':hidden').not('li[data-categories~="Shoes"], li[data-categories~="Ties"]', stores).fadeOut(); 
 
}); 
 

 
$('button.c').on('click', function(){ 
 
    stores.fadeIn(':hidden').not('li[data-categories~="Menswear"]', stores).fadeOut(); 
 
});
body { 
 
    font-size: 0.7em; 
 
} 
 

 
ul, li { 
 
    list-style: none; 
 
} 
 
a { text-decoration: none; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul class="store-list"> 
 
    <li data-categories="Bags Shoes Accessories Belts"> 
 
     <h3 itemprop="name">Enzo Poli</h3> 
 
    </li> 
 
    <li data-categories="Womenswear "> 
 
     <h3 itemprop="name">Ilse Jacobsen</h3> 
 
    </li> 
 
    <li data-categories="Menswear Womenswear Shoes Ties"> 
 
     <h3 itemprop="name">Kiman (Shoes Ties)</h3> 
 
    </li> 
 
    <li data-categories="Menswear Womenswear Shoes Knitwear"> 
 
     <h3 itemprop="name">Riccovero</h3> 
 
    </li> 
 
</ul> 
 

 
<button class="a">Ties</button> 
 
<button class="b">Ties & Shoes</button> 
 
<button class="c">Menswear</button>

+0

Ciao! La tua risposta potrebbe essere più utile alla domanda e alla comunità in generale se fornisci qualche contesto su come la tua risposta risolverà il problema nella domanda. http://stackoverflow.com/help/how-to-answer – Zack

+0

Anche se tutto in una riga funziona, puoi vedere come gli elementi vengono mostrati prima di essere nascosti di nuovo. Questo rende la lista "salta" mentre la soluzione di Joel rende tutto più fluido. – Steven