2012-12-14 14 views
16

मान लीजिए मैं निम्न HTML है:तत्व का चयन करें, जब तक कि यह सिर्फ एक चयनकर्ता का उपयोग करके किसी वर्ग के एक पूर्वज है

<div class="foo"> 
    <ul> 
    <li>One</li> 
    <li>Two</li> 
    </ul> 
</div> <!-- not originally here --> 
<div class="bar"> 
    <ul> 
    <li>Three</li> 
    <li>Four</li> 
    </ul> 
</div> 

मैं सभी li तत्वों कि वर्ग के साथ एक तत्व की सन्तान नहीं हैं का चयन करना चाहते foo। मुझे पता है कि मैं इसे एक फैंसी filter function के साथ कर सकता हूं, लेकिन मुझे आश्चर्य है कि मैं इसे सिर्फ एक चयनकर्ता के साथ कर सकता हूं। सबसे पहले मैंने कोशिश की:

$(":not(.foo) li") 

दुर्भाग्य से इस के बाद से li शैली (इस मामले में ul) के बिना अन्य पूर्वजों है काम नहीं करता। निम्नलिखित काम करने लगता है;

$(":not(.foo) :not(.foo) li") 

दूसरे शब्दों में, सभी li तत्वों कोई पूर्वज है कि या तो वर्ग foo है या वर्ग foo के साथ अपने स्वयं के एक पूर्वज है है का चयन करें। शायद यह चयनकर्ता के साथ ऐसा करने का सबसे अच्छा/एकमात्र तरीका है, लेकिन मैं :not चयनकर्ता की पुनरावृत्ति के बारे में रोमांचित नहीं हूं। वहाँ कोई बेहतर विचार है?

fiddle

+2

समस्या है कि यहाँ 'है।इसका अर्थ है "ली 'जिसका पूर्वजों का वर्ग है जिसमें वर्ग' foo' 'नहीं है। अंतर सूक्ष्म लगता है, लेकिन यह वास्तव में एक बहुत बड़ा अंतर है। – BoltClock

+0

हाँ बिल्कुल। और दूसरा मतलब है 'ली' जिसका पूर्वज है जिसके पास कक्षा 'foo' नहीं है और उसके पास वर्ग' foo' के साथ अपने पूर्वजों का पूर्वज नहीं है। जो मुझे लगता है वह सही परिणाम है, लेकिन वहां पहुंचने के लिए एक बहुत बदसूरत और असंतुष्ट तरीका है। –

उत्तर

24

आप इसे इस

$("li").not('.foo li') 

http://jsfiddle.net/y7s54/

012 की तरह कर सकते हैं

या

$("li:not(.foo li)") 

http://jsfiddle.net/QpCYY/

का चयन करें सभी ली के उस वर्ग foo के साथ एक पूर्वज नहीं है

+0

यह मेरे लिए सबसे अच्छा जवाब जैसा दिखता है जब तक कि किसी के विपरीत तर्क न हो। –

+0

मैं सहमत हूं; यह मेरे उल> ली उत्तर से बेहतर है। – DNS

0

इस बारे में कैसे:

$("li:not(.foo > li)") 

डॉक्स में टिप्पणी काफी उपयोगी होते हैं अगर यह काम नहीं करता:

http://api.jquery.com/not-selector/

+0

नहीं - http://jsfiddle.net/HsPSv/1/ –

+0

यह सही मूल विचार है, लेकिन काम नहीं करता है, क्योंकि lis .foo के प्रत्यक्ष वंशज नहीं हैं। – DNS

4

li:not(.foo > ul > li) का प्रयास करें; जो माता-पिता के साथ सभी lis minus का चयन करता है। दो स्तर ऊपर।

+0

मुझे यकीन नहीं है कि ओपी * क्यों नहीं है \ 'नहीं' चयनकर्ता * की पुनरावृत्ति के बारे में रोमांचित है। जो आपने लिखा है वह शायद JQuery/Sizzle में ठीक है, लेकिन CSS3 spec के अनुसार, 'नहीं' चयनकर्ता में केवल [सरल चयनकर्ता] हो सकते हैं (http://www.w3.org/TR/css3-selectors/ # सरल-चयनकर्ताओं-DFN)। – kojiro

+0

@kojiro: संभवतः क्योंकि 'नहीं' चयनकर्ता को दोहराया गया है जो CSS3-compliant है [वास्तव में काम नहीं करता] [http://stackoverflow.com/questions/7084112/css-negation-pseudo-class-not -किसी-अभिभावक पूर्वज-तत्वों/7084147 # 7084147)। ': Not' का उपयोग करके ऐसा करने का एकमात्र तरीका यह है कि मार्कअप की प्रकृति पर भरोसा नहीं करता है, इसे इस उत्तर में दिए गए अनुसार गैर-मानक तरीके से उपयोग किया जाता है जो jQuery/Sizzle द्वारा प्रदान किया जाता है। – BoltClock

+0

@ बोल्टक्लॉक यह ठीक काम करता है। यह सिर्फ इतना नहीं है कि आप क्या उम्मीद कर सकते हैं। – kojiro

2

आप नीचे के रूप में चयनकर्ता के साथ संदर्भ का उपयोग कर ऐसा कर सकते हैं,

$('li', $('div:not(.foo)')) 

LIve Demo

$('li', $('div:not(.foo)')).each(function(){ 
    alert($(this).text()); 
});​ 
+0

+1 - यह एक गैर-साधारण चयनकर्ता के साथ ': not' का उपयोग करने की अजीबता से बचाता है और शुद्ध सीएसएस के साथ लुकअप करने की अपेक्षा अधिक कुशल है। – kojiro

+1

असल में, यह तब तक अधिक कुशल नहीं है जब तक आप ': नहीं()' से आंतरिक उद्धरण हटाते हैं - उन्हें आवश्यक होने के कारण, और अमान्य सीएसएस है इसलिए यह कोई तेज़ नहीं होगा। Http://stackoverflow.com/questions/12475595/why-do-the-not-and-has-selectors-allow-quoted-arguments – BoltClock

+0

यह भी विफल रहता है अगर 'div.foo' के पूर्वजों में से कोई भी div : नहीं (.foo) '। – BoltClock

0

मैं इस समाधान एक छोटे से अच्छे लग रहा है लगता है, लेकिन वहाँ पर विवाद का एक सा गति अंतर के बारे में एपीआई टिप्पणियां। (.foo) li` नहीं मतलब यह नहीं है "` li` कोई पूर्वज है कि वर्ग `foo` है कि":

$("li").not(".foo li") 

fiddle

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

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