JQuery खोज (..) विधि की तलाश है जिसमें वर्तमान नोड शामिल है


134

JQuery के खोज (..) ट्रैवर्सल विधि में वर्तमान नोड शामिल नहीं है - यह वर्तमान नोड के बच्चों के साथ शुरू होता है। खोज ऑपरेशन को कॉल करने का सबसे अच्छा तरीका क्या है जिसमें इसके मिलान एल्गोरिदम में वर्तमान नोड शामिल है? डॉक्स के माध्यम से देखने से तुरंत कुछ भी नहीं निकलता है।

जवाबों:


153

JQuery 1.8 और ऊपर के लिए, आप उपयोग कर सकते हैं .addBack()। यह एक चयनकर्ता लेता है ताकि आपको परिणाम फ़िल्टर करने की आवश्यकता न हो:

object.find('selector').addBack('selector')

JQuery 1.8 से पहले आप .andSelf()(अब पदावनत और हटाए गए) के साथ फंस गए थे , जिसे तब छानने की जरूरत थी:

object.find('selector').andSelf().filter('selector')

5
मैंने इसे एक प्लगइन jquery.findIncludeSelf के रूप में बंडल किया है, जो बोवर के साथ पंजीकृत है। देखें github.com/ronen/jquery.findIncludeSelf
रोनेन

18
@ronen किसी चीज़ के लिए एक अतिरिक्त फ़ाइल जो एक पंक्ति में की जा सकती है? धन्यवाद, लेकिन इसकी कोई ज़रूरत नहीं।

6
@ prc322 एक अतिरिक्त फ़ाइल मुझे तैनाती के लिए परेशान नहीं करती है, जो किसी भी फ़ाइल में वैसे भी सभी जावास्क्रिप्ट को बंडल करती है। आम तौर पर मैं सामानों के साथ अपने कोड को अव्यवस्थित करने के बजाय सरल चीजों के लिए भी (परीक्षण किए गए) पुस्तकालय के तरीकों का उपयोग करना पसंद करता हूं, जो मुझे पढ़ने में कठिन लगता है और जो बग के लिए अधिक संभावनाओं का परिचय देता है। इस मामले में विशेष रूप से, IMHO को 'selector'दो बार निर्दिष्ट करने की आवश्यकता एन्कैप्सुलेशन को अतिरिक्त वांछनीय बनाती है। YMMV
राओन

ठीक है, इसलिए मैं मोटा हो सकता हूं लेकिन इसलिए आपको 'selector'दो बार निर्दिष्ट करने की आवश्यकता नहीं है , (जैसा कि @ronen द्वारा उल्लेख किया गया है), क्या आप सिर्फ उपयोग नहीं कर सकते हैं object.parent().find('selector')??? - यह कहा जा रहा है कि मुझे आपके लिए ऐसा करना पसंद है।
सैम

8
@ circa1983 object.parent().find('selector')में भाई-बहन objectऔर उनके वंशज शामिल हैं।
रॉबर्ट

41

आप इसे सीधे तौर पर नहीं कर सकते हैं, मैं इस बारे में सोच सकता हूं कि यह इस तरह से उपयोग .andSelf()और कॉल कर रहा है .filter():

$(selector).find(oSelector).andSelf().filter(oSelector)
//or...
$(selector).find('*').andSelf().filter(oSelector);

दुर्भाग्य से .andSelf()एक चयनकर्ता नहीं लेता है, जो आसान होगा।


7
आपने इस सवाल का जवाब देने के ठीक बाद jquery पेज पर एक टिप्पणी भी जोड़ दी । apqu.jquery.com/andSelf/#comment-50124533 अब यह पूरी तरह से ठीक है। अच्छा! मैंने अपना यथोचित परिश्रम और 'पसंद' किया कि वह भी एक हो।
जॉन के

2
दूसरा मनमौजी धीमा होगा। पहला बस धीमा है।
TGR

@Tgr - मैं असहमत नहीं हूं, हालांकि पहले यह शो नहीं होना चाहिए जब तक कि आप बहुत बड़ी संख्या में तत्वों के साथ काम नहीं कर रहे हों । यदि आपको श्रृंखला की आवश्यकता नहीं है, तो आप उन तत्वों को फिर से फ़िल्टर करना छोड़ सकते हैं।
निक Craver

3
दिलचस्प बात यह है closest(..)कि वर्तमान DOM तत्व और पेड़ को शामिल करता है जबकि सभी डाउन-ट्री-ट्रीज़रल तरीके जैसे find(..)आदि वर्तमान तत्व से मेल नहीं खाते हैं। यह ऐसा है जैसे कि jQuery की टीम ने उद्देश्यपूर्ण रूप से इन्हें बिना किसी ओवरलैप के लागू किया है जब दोनों ऑपरेशन एक पूर्ण ऊर्ध्वाधर खोज के लिए उपयोग किए गए थे।
जॉन के

17
ध्यान रखें कि .andSelf () को v1.8 के रूप में पदावनत किया गया है और .addBack () के साथ प्रतिस्थापित किया गया है जो चयनकर्ता को तर्क के रूप में लेता है। देखें api.jquery.com/addBack
kkara

9

परिभाषित करें

$.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 () काम करने के कारण कुछ शीर्ष तत्वों पर लागू नहीं किया गया था।


यह छोटी गाड़ी है। यह "स्वयं" के सभी को जोड़ता है, भले ही उनमें से केवल एक मेल खाता हो ... - इस बग का एक कारण एक क्रिप्टो नाम है jQuery विधि ...
रॉबर्ट सिएमर

मैंने आपके द्वारा बताए गए बग को ठीक करने का प्रयास किया। क्या यह अब ठीक से काम करता है?
दमित्री सिन्तसोव

अधिकांश अन्य उत्तर filter()वहां उपयोग करते हैं, जो अधिक समझ में आता है।
राबर्ट सीमर

5
$('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)):)
निक Craver

@Nick क्रेवर: हाँ, मैं फ़िल्टरिंग हिस्सा भूल गया, अब तय हो गया। यह वास्तव में मायने नहीं रखता है अगर $('selector')jQuery ऑब्जेक्ट प्राप्त करने के कुछ अन्य तरीके द्वारा प्रतिस्थापित किया जाता है (यदि ऐसा है जो आप चयनकर्ता के साथ शुरू नहीं कर रहे हैं), तो add()बस के रूप में कुछ भी संभाल $()सकते हैं।
TGR

मेरे बात यह थी कि अपने $('selector')हो सकता है $('selector').children('filter').closest('.class').last()... यह एक श्रृंखला में हो सकता है और आप कोई पता नहीं है कि वस्तु को जोड़ रहे हैं क्या है, तो सामान्य समाधान पिछले वस्तु ले जाना चाहिए फिल्टर की तरह :)
निक Craver

मैं अभी भी नहीं देखता कि क्यों एक समस्या होगी। thisजो भी jQuery वस्तु एक प्लगइन पर बुलाया गया था। यह सिर्फ एक कॉल श्रृंखला का परिणाम हो सकता है।
TGR

5

स्वीकृत उत्तर बहुत ही अक्षम है और पहले से ही मेल खाने वाले तत्वों के सेट को फ़िल्टर करता है।

//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);

3

यदि आप चाहते हैं कि चेनिंग ठीक से काम करे तो नीचे दिए गए स्निपेट का उपयोग करें।

$.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()है, तो एक से अधिक तत्व पहले से ही संतुष्ट हैं।
रॉबर्ट सीमर

3

यदि आप वास्तव में एक तत्व की तलाश कर रहे हैं , तो वर्तमान तत्व या उसके अंदर एक, आप उपयोग कर सकते हैं:

result = elem.is(selector) ? elem : elem.find(selector);

यदि आप ऐसे कई तत्वों की तलाश में हैं, जिनका आप उपयोग कर सकते हैं:

result = elem.filter(selector).add(elem.find(selector));

का उपयोग andSelf/andBack का बहुत दुर्लभ है, निश्चित नहीं है कि क्यों। प्रदर्शन के मुद्दों के कारण शायद कुछ लोग मेरे सामने उल्लेखित हैं।

(मैंने अब देखा कि ट्राग ने पहले ही वह दूसरा हल दे दिया था)


2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन इसका एक और सही तरीका है। यदि आदेश महत्वपूर्ण है, उदाहरण के लिए, जब आप एक चयनकर्ता से मिलान कर रहे हैं :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);
};

यह किसी भी तरह से कुशल नहीं है, लेकिन यह सबसे अच्छा मैं उचित क्रम बनाए रखने के लिए आया हूँ।


1

मुझे लगता andSelfहै कि तुम क्या चाहते हो:

obj.find(selector).andSelf()

ध्यान दें कि यह हमेशा वर्तमान नोड को वापस जोड़ देगा, चाहे वह चयनकर्ता से मेल खाता हो या नहीं।


1

यदि आप कड़ाई से वर्तमान नोड्स को देख रहे हैं तो आप बस कर देंगे

$(html).filter('selector')

0

मैं एक ऐसा समाधान खोजने की कोशिश कर रहा था, जो खुद को न दोहराए (यानी एक ही चयनकर्ता को दो बार दर्ज नहीं करना)।

और यह छोटा jQuery extention करता है:

jQuery.fn.findWithSelf = function(...args) {
  return this.pushStack(this.find(...args).add(this.filter(...args)));
};

यह (केवल वर्तमान सेट) के find()साथ filter()(केवल वर्तमान सेट) को जोड़ती है और दोनों जो भी खाते हैं उनका समर्थन करता है। के लिए pushStack()अनुमति देता है.end()उम्मीद के मुताबिक काम करने है।

इस तरह का उपयोग करें:

$(element).findWithSelf('.target')

-2

यहां सही (लेकिन दुखद) सत्य है:

$(selector).parent().find(oSelector).filter($(selector).find('*'))

http://jsfiddle.net/SergeJcqmn/MeQb8/2/


हालांकि, अलग-अलग नोड्स (और दस्तावेज़ स्वयं) के साथ काम नहीं करता है।
जॉन ड्वोरक

2
उह, नहीं, यह $(selector)सभी मामलों में सेट से खुद को हटा देगा ।
जॉन ड्वोरक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.