2015-06-03 3 views
7

यहां और शेष वेब पर पाए गए विभिन्न समाधानों का परीक्षण करने के बाद, मैं इसे "सरल" तरीका (या इसे बिल्कुल काम करने के लिए) तर्क का पता नहीं लगा सकता।मैं jQuery और CSS का उपयोग करके एकाधिक मान वाले एक सूची को फ़िल्टर कैसे कर सकता हूं?

मैं निम्नलिखित सूची है:

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

मैं Attribute Not Equal Selector उपयोग करने की कोशिश की है, लेकिन यह निश्चित रूप से काम नहीं करता।

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

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

एक और समस्या यह है कि जब मैं एक अलग श्रेणियों का चयन करता हूं, तो छुपा तत्व नहीं दिखाए जाते हैं।

मुझे पता है कि मैं $.each() का उपयोग कर सकता हूं और प्रत्येक तत्व के माध्यम से जा सकता हूं और यह देखने के लिए बहुत सारे कोड का उपयोग कर सकता हूं कि इसमें श्रेणी है या नहीं, यह जांचें या नहीं। लेकिन मैं बस उम्मीद कर रहा था कि एक बेहतर और सरल विकल्प होगा।

तो क्यू है; मैं किस फ़िल्टर का चयन करता हूं, इस आधार पर मैं सूची आइटम कैसे दिखा/छुपा सकता हूं?
See my fiddle here

+0

'button' के एक क्लिक पर केवल एक ही' li' तत्व को प्रदर्शित करने परिणाम की उम्मीद है? – guest271314

+0

सं।मेरे पास लगभग 13 श्रेणियां हैं I यदि मैं 3 श्रेणियों का चयन करता हूं, तो उन श्रेणियों वाले सभी आइटम दिखाए जाएंगे। बाकी सब कुछ छुपाया जाना चाहिए। – Steven

+0

'.filter()' का उपयोग करने का प्रयास करें; हालांकि 'बटन' '.innerHTML' – guest271314

उत्तर

6

इस प्रयास करें:

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>

आप देख सकते हैं मैं data~='item'!= के बजाय कि जिस तरह से यह जाँच करता है अगर यह डेटा-विशेषता पर कि शब्द है का उपयोग करें।

इसके अलावा, मैं उन लोगों में फीका लगाता हूं जिनमें श्रेणी है ताकि सभी प्रबंधन किया जा सके। निश्चित रूप से ऐसा करने का एक बेहतर तरीका है, लेकिन यह डिफ़ॉल्ट तर्क है।

+0

के खिलाफ परीक्षण के लिए' डेटा- * '' बटन 'तत्व को जोड़ने के विकल्प को बदल सकता है, अब हम जांचते हैं कि' डेटा-श्रेणियों 'में '~ =' का उपयोग करके' ए या बी 'है या नहीं। अगर मैं 'ए और बी' रखना चाहता हूं तो मैं कैसे जाउंगा? – Steven

+0

@Steven '[डेटा-श्रेणियों ~ = "संबंधों"], [डेटा-श्रेणियों ~ = "जूते"] में अल्पविराम को हटाएं और '[डेटा-श्रेणियां ~ =" संबंध "] का उपयोग करें [डेटा-श्रेणियां ~ =" जूते "]' और यह 'ए और बी' की जांच करता है जबकि अल्पविराम के साथ यह 'ए या बी' –

+0

जांचता है, अब मैं इसका उपयोग कर रहा हूं लेकिन यह किसी भी स्टोर का चयन करता है जिसमें या तो मेन्सवेअर _or_ जूते हैं। मेन्सवेअर _and_ जूते नहीं। – Steven

0

.fadeIn() का उपयोग करने के लिए कोई बिंदु नहीं - तो एक बार जब वे चले गए, तो वे चले गए। डेटा-श्रेणियां का

कोई भी एक भी मान का उपयोग करता है, तो = या != के लिए जाँच एक सटीक मिलान देना कभी नहीं होगा, ~= का उपयोग शब्द का मिलान कर:

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

[जोएल कोड के साथ जवाब प्रदान की गई है , तो यहां रोकना]

5

मुझे लगता है कि यहां दोष लगाने के लिए गलत धारणा यह है कि डेटा- * विशेषताएं रिक्त स्थान से कई मानों को अलग करने में कक्षाओं की तरह काम करती हैं। ऐसा नहीं है, यहां आप केवल एक स्ट्रिंग वाले एक स्ट्रिंग में arbtirary data-categories विशेषता सेट कर रहे हैं, इसलिए किसी दिए गए एकल श्रेणी से मिलान करने का प्रयास शायद काम नहीं करेगा। बेतकल्लुफ़, आप सभी तत्वों और के माध्यम से लूप उनके data-categories विशेषता अपने लक्ष्य के खिलाफ पैटर्न से मेल खा सकते हैं, जैसे:

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

एक बेहतर दृष्टिकोण एक डेटा विशेषता तथ्य उपयोग वर्गों के बजाय में करने के लिए हो सकता है, तो आप आसानी से कर सकते हैं कक्षा नहीं होने के आधार पर चयन।

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

हैलो! आपका उत्तर प्रश्न पूछने वाले और समुदाय के लिए अधिक उपयोगी हो सकता है यदि आप कुछ संदर्भ प्रदान करते हैं कि आपका जवाब प्रश्न में इस मुद्दे को कैसे हल करेगा। http://stackoverflow.com/help/how-to-answer – Zack

+0

हालांकि सभी एक पंक्ति में काम करते हैं, आप देख सकते हैं कि तत्वों को फिर से छुपाए जाने से पहले कैसे दिखाया जाता है। यह सूची "कूद" बनाता है जबकि जोएल का समाधान यह चिकना बनाता है। – Steven

संबंधित मुद्दे

 संबंधित मुद्दे