2009-06-08 6 views
62

मैं एक तरह से सभी तत्वों जिसका वर्ग हैं का चयन करने के रूप मेंक्या JQuery चयनकर्ता माता-पिता के साथ आइटम को बहिष्कृत करता है जो किसी दिए गए चयनकर्ता से मेल खाता है?

var $set = $('.foo,.bar').filter(
    function() {return $(this).parents('.baz').length < 1;}); 

या तो foo या bar और जो एक तत्व जिसका वर्ग baz है से उतरना नहीं है। क्या कोई चयनकर्ता है जो फ़िल्टरिंग लैम्ब्डा की आवश्यकता के बिना एक ही चीज़ को पूरा करेगा? अपने शीर्ष स्तर चयनकर्ता के लिए नहीं:

<div class='foo'/><!--match this--> 
<div class='bar'/><!--match this--> 
<div class='baz'> 
    <div class='foo'/> <!--don't match this--> 
</div> 
+2

सभी जवाब मैं जिस तरह से आप सबसे अच्छा कर रहे हैं की तरह से। – Dean

+2

आप इसे तेजी से बनाने के लिए 'माता-पिता 'की बजाय' निकटतम 'विधि का उपयोग कर सकते हैं। 'निकटतम' एक बार मिलान करने वाले तत्व को ढूंढने के बाद देखता है, जबकि 'माता-पिता' मिलान तत्वों को खोजने के लिए दस्तावेज़ के मूल तत्व में डोम पेड़ की यात्रा करता है। – RayOnAir

उत्तर

72

इस मामले की सच्चाई यह है कि jQuery के पास बस आप जो चाहते हैं उसे करने के लिए विशेष रूप से सुरुचिपूर्ण तरीका नहीं है। जबकि अराजकता का जवाब काम करता है, आपको आश्चर्य करना होगा कि क्या जटिल चयनकर्ता (जो एक चयनकर्ता के रूप में धीमा होगा, जटिल वेबपृष्ठ में हो सकता है) इसके लिए अधिक वर्बोज़ पर तेज़ है लेकिन तेज़ फ़िल्टर फ़ंक्शन है। यह वास्तव में एक सौदा का बड़ा नहीं है, मैं विशेष रूप से लंबे, चुस्त चयनकर्ताओं से व्यक्तिगत रूप से थके हुए हूं जब मैं इससे बच सकता हूं। के बाद से jQuery भयानक है

एक अलग विकल्प, अपने खुद के चयनकर्ता बनाने के लिए है:

jQuery.expr[':'].parents = function(a,i,m){ 
    return jQuery(a).parents(m[3]).length < 1; 
}; 

$('.foo,.bar').filter(':parents(.baz)'); 

expr नक्शा कड़ाके की धूप चयनकर्ता इंजन और प्रलेखन का हिस्सा यहां पाया जा सकता है: Sizzle Custom Pseudo-Selectors

+0

को स्वीकार करने के लिए +1 क्योंकि यह अराजकता से अधिक पूर्ण है '- मुझे expr सरणी के लिए API पर दस्तावेज़ कहां मिल सकता है? –

+0

जहां तक ​​मुझे पता है, वास्तव में कोई भी नहीं है। –

+0

इस उत्तर ने मेरे लिए एक ही समस्या हल की। +1 – friedo

1

चयनकर्ता अराजकता देता है काम करना चाहिए:

$('.foo:not(.baz .foo),.bar:not(.baz .bar)') 

बस आप FireFinder बुलाया FireBug के लिए एक विस्तार है कि आप अपने सीएसएस/jQuery चयनकर्ताओं का परीक्षण करने के लिए उपयोग कर सकते के बारे में एक टिप देना चाहता था।

वेबसाइट से: अग्निशामक फ़ायरबग (फ़ायरफ़ॉक्स में) का विस्तार है और एक त्वरित तरीके से कार्यक्षमता प्रदान करता है, चयनित सीएसएस चयनकर्ता या XPath अभिव्यक्ति से मेल खाने वाले HTML तत्व ढूंढें। यह आपको एक ही समय में सामग्री को देखते हुए पृष्ठ में अपने सीएसएस चयनकर्ताओं को तत्काल परीक्षण करने की अनुमति देता है, और मिलान तत्वों को हाइलाइट किया जाएगा।

+0

+1 मुझे फ़ायरफ़िंडर – Dean

14

मैं नहीं कर सके 'टी यह काम करने के लिए मिलता है:

$(".children:not(#parent .children)"); 

लेकिन मैं यह काम करने के लिए प्राप्त कर सकते हैं:

$(".children").not($("#parent .children")); 

नोट: सुनिश्चित नहीं हैं कि अगर यह कुछ jQuery संस्करण के साथ क्या करना मैं 1.2.6

+0

'$() का उपयोग नहीं।()' सबसे आसान समाधान है। और यह ठीक है [दस्तावेज] (http://api.jquery.com/not/) जो कुछ भी पूछा गया है उसे करने के लिए। – peter

1

var $li = jQuery('li', this).not('.dropdown-menu > li');

मैं उपयोग कर रहा हूँ जड़ें विषय का उपयोग कर रहा है और वे 'उप से ड्रॉपडाउन बदल .dropdown-मेनू '

2

' को 'मेनू यह एक कोशिश:

   $('div') 
       .filter(function() { 

        return ($(this).parent().not('.baz')); 
       }) 
संबंधित मुद्दे