जवाबों:
JQuery 1.8 और ऊपर के लिए, आप उपयोग कर सकते हैं .addBack()। यह एक चयनकर्ता लेता है ताकि आपको परिणाम फ़िल्टर करने की आवश्यकता न हो:
object.find('selector').addBack('selector')
JQuery 1.8 से पहले आप .andSelf()(अब पदावनत और हटाए गए) के साथ फंस गए थे , जिसे तब छानने की जरूरत थी:
object.find('selector').andSelf().filter('selector')
'selector'दो बार निर्दिष्ट करने की आवश्यकता एन्कैप्सुलेशन को अतिरिक्त वांछनीय बनाती है। YMMV
'selector'दो बार निर्दिष्ट करने की आवश्यकता नहीं है , (जैसा कि @ronen द्वारा उल्लेख किया गया है), क्या आप सिर्फ उपयोग नहीं कर सकते हैं object.parent().find('selector')??? - यह कहा जा रहा है कि मुझे आपके लिए ऐसा करना पसंद है।
object.parent().find('selector')में भाई-बहन objectऔर उनके वंशज शामिल हैं।
आप इसे सीधे तौर पर नहीं कर सकते हैं, मैं इस बारे में सोच सकता हूं कि यह इस तरह से उपयोग .andSelf()और कॉल कर रहा है .filter():
$(selector).find(oSelector).andSelf().filter(oSelector)
//or...
$(selector).find('*').andSelf().filter(oSelector);
दुर्भाग्य से .andSelf()एक चयनकर्ता नहीं लेता है, जो आसान होगा।
closest(..)कि वर्तमान DOM तत्व और पेड़ को शामिल करता है जबकि सभी डाउन-ट्री-ट्रीज़रल तरीके जैसे find(..)आदि वर्तमान तत्व से मेल नहीं खाते हैं। यह ऐसा है जैसे कि jQuery की टीम ने उद्देश्यपूर्ण रूप से इन्हें बिना किसी ओवरलैप के लागू किया है जब दोनों ऑपरेशन एक पूर्ण ऊर्ध्वाधर खोज के लिए उपयोग किए गए थे।
परिभाषित करें
$.fn.findSelf = function(selector) {
var result = this.find(selector);
this.each(function() {
if ($(this).is(selector)) {
result.add($(this));
}
});
return result;
};
तो उपयोग करें
$.findSelf(selector);
के बजाय
$find(selector);
अफसोस की बात है कि jQuery में यह बिल्ट-इन नहीं है। विकास के इतने वर्षों के लिए वास्तव में अजीब है। मेरे AJAX संचालकों को .find () काम करने के कारण कुछ शीर्ष तत्वों पर लागू नहीं किया गया था।
filter()वहां उपयोग करते हैं, जो अधिक समझ में आता है।
$('selector').find('otherSelector').add($('selector').filter('otherSelector'))
आप $('selector')स्पीडअप के लिए एक चर में स्टोर कर सकते हैं । आप इसके लिए एक कस्टम फ़ंक्शन भी लिख सकते हैं यदि आपको इसकी बहुत आवश्यकता है:
$.fn.andFind = function(expr) {
return this.find(expr).add(this.filter(expr));
};
$('selector').andFind('otherSelector')
$('selector').find('otherSelector').add($('otherSelector')), जो आपके पास है वह अब इसके बराबर है .andSelf()। अन्त में, .andFind()अभिव्यक्ति के आधार पर फ़िल्टर नहीं है, आप की आवश्यकता होगी .add($(this).filter(expr)):)
$('selector')jQuery ऑब्जेक्ट प्राप्त करने के कुछ अन्य तरीके द्वारा प्रतिस्थापित किया जाता है (यदि ऐसा है जो आप चयनकर्ता के साथ शुरू नहीं कर रहे हैं), तो add()बस के रूप में कुछ भी संभाल $()सकते हैं।
$('selector')हो सकता है $('selector').children('filter').closest('.class').last()... यह एक श्रृंखला में हो सकता है और आप कोई पता नहीं है कि वस्तु को जोड़ रहे हैं क्या है, तो सामान्य समाधान पिछले वस्तु ले जाना चाहिए फिल्टर की तरह :)
thisजो भी jQuery वस्तु एक प्लगइन पर बुलाया गया था। यह सिर्फ एक कॉल श्रृंखला का परिणाम हो सकता है।
स्वीकृत उत्तर बहुत ही अक्षम है और पहले से ही मेल खाने वाले तत्वों के सेट को फ़िल्टर करता है।
//find descendants that match the selector
var $selection = $context.find(selector);
//filter the parent/context based on the selector and add it
$selection = $selection.add($context.filter(selector);
यदि आप चाहते हैं कि चेनिंग ठीक से काम करे तो नीचे दिए गए स्निपेट का उपयोग करें।
$.fn.findBack = function(expr) {
var r = this.find(expr);
if (this.is(expr)) r = r.add(this);
return this.pushStack(r);
};
अंतिम फ़ंक्शन के कॉल के बाद यह #foo तत्व देता है।
$('#foo')
.findBack('.red')
.css('color', 'red')
.end()
.removeAttr('id');
अतिरिक्त प्लगइन्स को परिभाषित किए बिना, आप इसके साथ फंस गए हैं।
$('#foo')
.find('.red')
.addBack('.red')
.css('color', 'red')
.end()
.end()
.removeAttr('id');
thisहोता this.is()है, तो एक से अधिक तत्व पहले से ही संतुष्ट हैं।
यदि आप वास्तव में एक तत्व की तलाश कर रहे हैं , तो वर्तमान तत्व या उसके अंदर एक, आप उपयोग कर सकते हैं:
result = elem.is(selector) ? elem : elem.find(selector);
यदि आप ऐसे कई तत्वों की तलाश में हैं, जिनका आप उपयोग कर सकते हैं:
result = elem.filter(selector).add(elem.find(selector));
का उपयोग andSelf/andBack का बहुत दुर्लभ है, निश्चित नहीं है कि क्यों। प्रदर्शन के मुद्दों के कारण शायद कुछ लोग मेरे सामने उल्लेखित हैं।
(मैंने अब देखा कि ट्राग ने पहले ही वह दूसरा हल दे दिया था)
मुझे पता है कि यह एक पुराना सवाल है, लेकिन इसका एक और सही तरीका है। यदि आदेश महत्वपूर्ण है, उदाहरण के लिए, जब आप एक चयनकर्ता से मिलान कर रहे हैं :first, जैसे , मैंने एक छोटा फ़ंक्शन लिखा है जो ठीक उसी परिणाम को लौटाएगा जैसे कि find()वास्तव में तत्वों का वर्तमान सेट शामिल है:
$.fn.findAll = function(selector) {
var $result = $();
for(var i = 0; i < this.length; i++) {
$result = $result.add(this.eq(i).filter(selector));
$result = $result.add(this.eq(i).find(selector));
}
return $result.filter(selector);
};
यह किसी भी तरह से कुशल नहीं है, लेकिन यह सबसे अच्छा मैं उचित क्रम बनाए रखने के लिए आया हूँ।
यदि आप कड़ाई से वर्तमान नोड्स को देख रहे हैं तो आप बस कर देंगे
$(html).filter('selector')
मैं एक ऐसा समाधान खोजने की कोशिश कर रहा था, जो खुद को न दोहराए (यानी एक ही चयनकर्ता को दो बार दर्ज नहीं करना)।
और यह छोटा jQuery extention करता है:
jQuery.fn.findWithSelf = function(...args) {
return this.pushStack(this.find(...args).add(this.filter(...args)));
};
यह (केवल वर्तमान सेट) के find()साथ filter()(केवल वर्तमान सेट) को जोड़ती है और दोनों जो भी खाते हैं उनका समर्थन करता है। के लिए pushStack()अनुमति देता है.end()उम्मीद के मुताबिक काम करने है।
इस तरह का उपयोग करें:
$(element).findWithSelf('.target')
यहां सही (लेकिन दुखद) सत्य है:
$(selector).parent().find(oSelector).filter($(selector).find('*'))
$(selector)सभी मामलों में सेट से खुद को हटा देगा ।