2012-02-16 14 views
6

मैं बहुत की तरह एक संरचना है कहते हैं:jQuery में एक ही विशेषता मान वाले तत्वों का चयन कैसे करें?

<div data-stuff="foo"></div> 
<div data-stuff="foo"></div> 
<div data-stuff="foo"></div> 
<div data-stuff="bar"></div> 
<div data-stuff="bar"></div> 
<div data-stuff="bar"></div> 
<div data-stuff="baz"></div> 

और मैं पहली बार को छोड़कर एक ही विशेषता के साथ सभी divs छुपाना चाहते हैं, तो मैं मिल चाहते हैं:

<div data-stuff="foo"></div> 
<div data-stuff="bar"></div> 
<div data-stuff="baz"></div> 

अब मैं मुझे पता है बस ऐसा कर सकता है:

$('[data-stuff=foo]:gt(0), [data-stuff=bar]:gt(0), [data-stuff=baz]:gt(0)').hide(); 

समस्या है, data-stuff का मूल्य गतिशील रूप से उत्पन्न और अप्रत्याशित है। मैं इस काम को पूरा करने के लिए क्या कर सकता हूं?

संपादित

डोम तत्वों खुद को जरूरी ही नहीं हैं, तो $ .unique() में मदद नहीं करेगा यहाँ। यह भी महत्वपूर्ण है कि पहला वह दिखाता है जो दिखाता रहता है, इसलिए पुनर्मूल्यांकन नहीं हो सकता है।

+1

पी.एस. '$ .unique' जिस तरीके से आपको लगता है वह काम नहीं करता है। '$ .unique 'डीओएम तत्वों के सरणी के लिए है, jQuery jQuery वस्तुओं को बनाते समय आंतरिक रूप से इसका उपयोग करता है। –

+0

[jQuery - विशेषता द्वारा कैसे चुनें] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/9210073/jquery-how-to-select-by-attribute) –

+0

आप ऊपर दिए गए कोड को क्यों निष्पादित नहीं कर सकते 'rel' बदल गया है? – JKirchartz

उत्तर

5

जानवर बल रास्ता:

var found = {}; 

$("[rel]").each(function(){ 
    var $this = $(this); 
    var rel = $this.attr("rel"); 

    if(found[rel]){ 
     $this.hide(); 
    }else{ 
     found[rel] = true; 
    } 
}); 
+0

+1 हाँ के लिए हालांकि यह सोच सकता था कि मैं यही सोच रहा था। मुझे नहीं पता कि इस प्रति कहने के लिए कोई चयनकर्ता है या नहीं ... – pixelbobby

4

कैसे कुछ इस तरह के बारे में:

$('div[rel]:visible').each(function(){ 
    var rel = $(this).attr('rel'); 
    $(this).nextAll('div[rel="'+rel+'"]').hide(); 
}); 

डेमो: http://jsfiddle.net/CsTQT/

+1

ध्यान दें कि 'अगला' केवल भाई बहनों के लिए काम करता है, इसलिए यदि HTML संरचना वास्तव में पोस्ट किए गए उदाहरण की तुलना में अधिक जटिल है, तो यह काम नहीं कर सकती है। –

+0

अनजाने में, @JamesMontagne सही है। मुझे इसे अपने प्रश्न के लिए ध्यान में रखना चाहिए था और मैंने माफ़ी मांगी। मैं +2 अगर मैं jsfiddle –

2

सबसे पहले, rel डेटा भंडारण के लिये किया जाता है। डब्ल्यू 3 सी के अनुसार, रिलायंस "वर्तमान दस्तावेज़ से संबंध को href विशेषता द्वारा निर्दिष्ट एंकर पर रिश्ते का वर्णन करता है। इस विशेषता का मान लिंक प्रकारों की एक स्पेस से अलग सूची है।"

दूसरा, rel केवल <a> और <link> पर एक विशेषता है। आप वास्तव में data-* एचटीएमएल 5 विशेषता का उपयोग करना चाहते हैं। ब्राउज़र समर्थन के बारे में चिंता न करें, यह आईई 66 (शायद 5) पर वापस काम करता है।

यह JQuery $.data('name') फ़ंक्शन के माध्यम से पहुंच योग्य होगा।

<div data-foo="bar"></div> 

के माध्यम से सुलभ हो जाएगा:

$('div').filter(function(inputs){ 
    return $(this).data('foo') === 'bar'; 
}).hide() 
+0

क्षमा करें। मैं वास्तव में रिले का उपयोग नहीं कर रहा हूँ। मेरे पास मेरे कोड स्निपेट्स में एक उदाहरण था जो एंकर टैग के साथ एक ही चीज़ का इस्तेमाल करता था, और यह एक त्वरित प्रतिलिपि थी और फिर बाद में एक विचार के रूप में मैंने उन्हें डीवी में बदल दिया। अच्छा पकड़, यद्यपि –

0

मतलब यह है कि: यदि आप पहले तत्व का चयन करें, आप प्रत्येक भाइयों को छिपाना चाहते हैं; :eq(0)

var jq= $('[data-stuff=foo]:eq(0)') 

2 के माध्यम से 1. पहले का चयन करें:

$('[data-stuff=foo]:eq(0)').brothersByAttr('data-stuff').hide(); 
$('[data-stuff=bar]:eq(0)').brothersByAttr('data-stuff').hide(); 
$('[data-stuff=baz]:eq(0)').brothersByAttr('data-stuff').hide(); 

डेमो::http://jsfiddle.net/abdennour/7ypEa/1/

स्पष्टीकरण तो JBrothersByAttr jQuery प्लगइन जो Mounawa3et منوعات Jquery plugin का एक हिस्सा है का उपयोग करें।JBrothersByAttr के माध्यम से दूसरों के तत्वों data-stuff attr का एक ही मूल्य है कि चयन करें:

var brothers=jq.brothersByAttr('data-stuff') 

3.Hide यह

brothers.hide() 
संबंधित मुद्दे