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.findIncludSelf
রনেন

18
@ আয়রন এমন কিছু জন্য একটি অতিরিক্ত ফাইল যা এক লাইনে করা যায়? ধন্যবাদ কিন্তু ধন্যবাদ না.

6
@ prc322 একটি অতিরিক্ত ফাইল আমাকে মোতায়েনের জন্য বিরক্ত করে না যা সমস্ত জাভাস্ক্রিপ্টকে কোনও একক ফাইলে বান্ডিল করে। সাধারণত আমি সাধারণ জিনিসগুলির জন্য (পরীক্ষিত) লাইব্রেরি পদ্ধতিগুলি ব্যবহার করা পছন্দ করি, বরং আমার কোডটি এমন স্টাফের সাথে ঝাঁকুনির চেয়ে যেগুলি পড়তে আমার পক্ষে আরও বেশি কঠিন এবং এটি বাগের জন্য আরও সম্ভাবনার পরিচয় দেয়। বিশেষত এই ক্ষেত্রে, আইএমএইচও 'selector'দু'বার নির্দিষ্ট করার প্রয়োজনটি এনক্যাপসুলেশনকে অতিরিক্ত আকাঙ্ক্ষিত করে। YMMV
রনেন

ঠিক আছে তাই আমি ঘন হতে 'selector'চলেছি তবে আপনাকে দুবার নির্দিষ্ট করতে হবে না , (যেমন @ ব্রোনেন উল্লেখ করেছেন), আপনি কেবল ব্যবহার করতে পারবেন না object.parent().find('selector')??? - এটা বলা হচ্ছে যে আমি একটি লাইব ধারণা পছন্দ করি যা এটি আপনার জন্য করে।
স্যাম

8
@ সার্কা 1983 এর object.parent().find('selector')মধ্যে ভাইবোন objectএবং তাদের বংশধরদের অন্তর্ভুক্ত রয়েছে ।
রবার্ট

41

আপনি সরাসরি এটি করতে পারবেন না, আমি ভাবতে পারি এমন নিকটতমটি হ'ল ব্যবহার করা .andSelf()এবং কল করা .filter(), এরকম:

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

দুর্ভাগ্যক্রমে .andSelf()কোনও নির্বাচক নেন না, যা কার্যকর হবে।


7
আপনি এই প্রশ্নের উত্তর দেওয়ার পরেও jquery পৃষ্ঠায় একটি মন্তব্য যুক্ত করেছেন api.jquery.com/andSelf/#comment-50124533 এখন বিষয়টি পুরোপুরি। নিস! আমি আমার যথাযথ পরিশ্রম করেছি এবং এটিও 'পছন্দ' করেছি।
জন কে

2
দ্বিতীয়টি হ'ল মনমুগ্ধকর ধীর। প্রথমটি কেবল ধীর।
টিজিআর

@Tgr - আমি অসম্মতি না, যদিও প্রথমে একটি সঙ্গে যে শো কি ডিলিং যদি না আপনি করা উচিত হবে না খুব উপাদানের সংখ্যক। আপনার যদি শৃঙ্খলার দরকার না হয় তবে আপনি অবশ্যই এই উপাদানগুলিকে পুনরায় ফিল্টারিং এড়িয়ে যেতে পারেন।
নিক ক্র্যাভার

3
মজার বিষয় হল, closest(..)বর্তমান ডিওএম উপাদান এবং গাছের উপরে থাকা রয়েছে যেখানে সমস্ত ডাউন-দ্য-ট্রি-ট্র্যাভারসাল পদ্ধতিগুলি find(..)ইত্যাদির মতো বর্তমান উপাদানটির সাথে মেলে না। উভয় ক্রিয়াকলাপ যখন সম্পূর্ণ উল্লম্ব অনুসন্ধানের জন্য একসাথে ব্যবহৃত হয় তখন jQuery টি দল উদ্দেশ্যমূলকভাবে এগুলি কোনও ওভারল্যাপের জন্য বাস্তবায়িত করেছিল।
জন কে

17
মনে রাখবেন যে .এন্ডসেল্ফ () কে v1.8 হিসাবে অবচিত করা হয়েছে এবং .addBack () দ্বারা প্রতিস্থাপন করা হয়েছে যা একটি নির্বাচককে যুক্তি হিসাবে গ্রহণ করে। Api.jquery.com/addBack
kaka

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 এর এই অন্তর্নির্মিত নেই। বিকাশের এত বছরের জন্য সত্যিই অদ্ভুত। .ফাইন্ড () কীভাবে কাজ করে তার কারণে আমার এজেএক্স হ্যান্ডলারগুলি কিছু শীর্ষ উপাদানগুলিতে প্রয়োগ করা হয়নি।


এটি বগি। এটি সমস্ত "স্ব" যুক্ত করে, এমনকি যদি তাদের মধ্যে একটির সাথেও মেলে ... - এই বাগের একটি কারণ হ'ল ক্রিপিলি নামযুক্ত 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)):)
নিক ক্র্যাভার

@ নিক ক্র্যাভার: হ্যাঁ, আমি এখনই ঠিক করা ফিল্টারিং অংশটি ভুলে গেছি। এটা সত্যিই কোন ব্যাপার যদি না $('selector')একটি jQuery বস্তুর পেয়ে (যদি হয় যে আপনি একটি নির্বাচক দিয়ে শুরু না বলতে কী বোঝ) এর অন্য কোন পদ্ধতি দ্বারা প্রতিস্থাপিত হয়, add()ঠিক যেমন কিছু ব্যবস্থা করতে সক্ষম $()করতে পারেন।
টিজিআর

আমার বক্তব্যটি হ'ল আপনার $('selector')হতে পারে $('selector').children('filter').closest('.class').last()... এটি একটি শৃঙ্খলে থাকতে পারে এবং আপনি যে অবজেক্টটি যুক্ত করছেন সে সম্পর্কে আপনার কোনও ধারণা নেই, তাই জেনেরিক সমাধানটি ফিল্টারের মতো আগের
বিষয়টিকে

আমি এখনও দেখছি না যে কেন এটি সমস্যা হবে। 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 এক্সটেনশন এটি করে:

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)সমস্ত ক্ষেত্রে সেট থেকে নিজেকে সরিয়ে ফেলবে।
জন ডিভোরাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.