সন্তানের পিতামাতার তুলনায় উপাদান সূচক পান


160

ধরা যাক আমার এই মার্কআপটি রয়েছে:

<ul id="wizard">
    <li>Step 1</li>
    <li>Step 2</li>
</ul>

এবং আমি এই jQuery আছে:

$("#wizard li").click(function () {
    // alert index of li relative to ul parent
});

আমি liযখন এটি ক্লিক করব তখন তার পিতামাতার সাথে তুলনামূলক সন্তানের সূচকটি কীভাবে পেতে পারি li?

উদাহরণস্বরূপ, আপনি যখন "পদক্ষেপ 1" ক্লিক করেন, alert"0" সহ একটি পপ আপ করা উচিত।

উত্তর:


247
$("#wizard li").click(function () {
    console.log( $(this).index() );
});

তবে প্রতিটি তালিকার আইটেমের জন্য একটি ক্লিক হ্যান্ডলার সংযুক্তি না করে ব্যবহার করা ভাল (পারফরম্যান্স ওয়াইস) delegateযা দেখতে দেখতে এটি ব্যবহার করা ভাল :

$("#wizard").delegate('li', 'click', function () {
    console.log( $(this).index() );
});

JQuery 1.7+ এ আপনার ব্যবহার করা উচিত on#wizardপ্রতিনিধি ইভেন্টের মতো কাজ করে নীচের উদাহরণটি ইভেন্টটিকে উপাদানটির সাথে আবদ্ধ করে :

$("#wizard").on("click", "li", function() {
    console.log( $(this).index() );
});

3
হাই রেডস্কয়ার .. আমি jQuery নিয়ে অনুশীলন করছি, আমি ডেলিগেট সম্পর্কে n00b: ডি .. প্রতিনিধি ইভেন্টগুলিতে সরাসরি ইভেন্টগুলিতে যুক্ত হওয়ার চেয়ে কেন ভাল?
স্টেকবি

1
@ স্টেওয়েব - আরে - কারণ একটি ইভেন্ট হ্যান্ডলার সম্ভাব্য অনেকের চেয়ে বেশি পছন্দনীয়। ডোমের সাথে ইভেন্টগুলি সংযুক্ত করা ব্যয়বহুল হতে পারে যদি আপনার কাছে বড় তালিকাগুলি থাকে তবে একটি বিধি হিসাবে আমি প্রতিটি উপাদানটিতে পৃথক হ্যান্ডলারগুলির চেয়ে উপরেরটি যেখানে সম্ভব সম্ভব ব্যবহার করার চেষ্টা করি। একটি নিবন্ধ যা গভীরতর হয় তা হল ব্রায়ানক্রিসিমানো.com / 2008 / 05 / 19/… - এছাড়াও গুগল 'জাভাস্ক্রিপ্ট ইভেন্ট প্রতিনিধি'
redsquare

ঠিক আছে, সুতরাং, ইভেন্টগুলি এইভাবে পরিচালনা করা এটি ক্লাসিক 'ডোম সংযুক্তি' এর চেয়ে হালকা কিছু :) :) ধন্যবাদ!
স্টিচবি

@ স্টেওয়েব - এটি আরও হালকা কারণ জ্যাকুয়েরিতে সমস্ত লি উপাদানগুলির প্রাথমিক অনুসন্ধান করার প্রয়োজন নেই। এটি কেবল ধারকটিকে সন্ধান করে এবং ক্লিক করা বস্তুটি কোনও লি ছিল কিনা তা দেখার জন্য সেই স্তরটি শুনে।
redsquare

এই .index পদ্ধতিটি আমার পক্ষে অত্যন্ত সহায়ক। আমি বাছাই করতে jQuery বাছাইযোগ্য ব্যবহার করছি, তবে এটি ডিওমে অর্থপূর্ণ র‌্যাঙ্কিংয়ের তথ্য সঞ্চয় করে। .Index () এর সাহায্যে আমি র‌্যাঙ্কিংটি ডোম থেকে সত্যিই পরিষ্কারভাবে পিছনে টেনে আনতে পারি। ধন্যবাদ!
সিম্পলজি

41

কিছুটা এইরকম:

$("ul#wizard li").click(function () {
  var index = $("ul#wizard li").index(this);
  alert("index is: " + index)
});

9
দুর্দান্ত সংযোজন - আমরা পিতামাতা নির্বাচকের তুলনায় তুলনামূলকভাবে সূচকটি খুঁজে পেতে পারি। +1
বাসটেলার

1
এই উত্তরটিকে প্রাধান্য দিন কারণ এটি আসলে প্রশ্নের উত্তর দেয় তবে উদাহরণের জন্য একটি সম্ভাব্য সমাধান
ডার্কমুক্কে


4

আপনি যদি না চান তবে এটি সম্পন্ন করার জন্য jQuery এর মতো বড় লাইব্রেরির প্রয়োজন নেই। অন্তর্নির্মিত ডিওএম ম্যানিপুলেশন সহ এটি অর্জন করতে, liএকটি অ্যারেতে ভাইবোনদের সংগ্রহ পান এবং indexOfক্লিক করে সেই অ্যারেতে ক্লিক করা উপাদানটি পরীক্ষা করে দেখুন ।

const lis = [...document.querySelectorAll('#wizard > li')];
lis.forEach((li) => {
  li.addEventListener('click', () => {
    const index = lis.indexOf(li);
    console.log(index);
  });
});
<ul id="wizard">
    <li>Step 1</li>
    <li>Step 2</li>
</ul>

বা, ইভেন্ট প্রতিনিধি সহ:

const lis = [...document.querySelectorAll('#wizard li')];
document.querySelector('#wizard').addEventListener('click', ({ target }) => {
  // Make sure the clicked element is a <li> which is a child of wizard:
  if (!target.matches('#wizard > li')) return;
  
  const index = lis.indexOf(target);
  console.log(index);
});
<ul id="wizard">
    <li>Step 1</li>
    <li>Step 2</li>
</ul>

বা, যদি শিশু উপাদানগুলি গতিশীলভাবে পরিবর্তিত হতে পারে (টুডো তালিকার মতো), তবে আপনাকে liআগে থেকে বরং প্রতিটি ক্লিকে গুলি এর অ্যারে তৈরি করতে হবে :

const wizard = document.querySelector('#wizard');
wizard.addEventListener('click', ({ target }) => {
  // Make sure the clicked element is a <li>
  if (!target.matches('li')) return;
  
  const lis = [...wizard.children];
  const index = lis.indexOf(target);
  console.log(index);
});
<ul id="wizard">
    <li>Step 1</li>
    <li>Step 2</li>
</ul>


... (...)। indexOf কোনও ফাংশন নয়
কারিম

2
আমার উত্তরের কোড স্নিপেটগুলির কোনওটিই ত্রুটিটি তৈরি করে না - আপনি সেগুলি কাজ করতে দেখতে "রান কোড স্নিপেট" টিপতে পারেন। যদি আপনি এই ত্রুটিটি পেয়ে থাকেন তবে আপনি আলাদা কোড ব্যবহার করছেন - মনে হচ্ছে আপনি jQuery ব্যবহার করছেন তবে আমার উত্তরটি jQuery ছাড়াই এই ধরণের জিনিসটি কীভাবে সম্পাদন করতে পারে তা দেখিয়ে
দিচ্ছে

যথেষ্ট ফর্সা। হ্যাঁ, আমি জ্যাকুয়ারি ব্যবহার করছি। ধন্যবাদ
করিম

3

ডেলিগেট এবং লাইভ ব্যবহার করা সহজ তবে আপনার যদি আর কোনও লি না থাকে: গতিশীলভাবে আপনি যুক্ত করে থাকেন তবে ইভেন্টের ডেলাগেশনটি সাধারণ বাইন্ড / ক্লিকের সাথেও ব্যবহার করতে পারেন। এই পদ্ধতিটি ব্যবহার করে কিছু পারফরম্যান্স লাভ করা উচিত যেহেতু নতুন মিলনের উপাদানগুলির জন্য ডোমকে নজরদারি করতে হবে না। কোনও আসল নম্বর পাওয়া যায় নি তবে তা বোঝা যায় :)

$("#wizard").click(function (e) {
    var source = $(e.target);
    if(source.is("li")){
        // alert index of li relative to ul parent
        alert(source.index());
    }
});

আপনি এটি জেএসফিডেলে পরীক্ষা করতে পারেন: http://jsfiddle.net/jimmysv/4Sfdh/1/


1
আপনি যখন এই 'ডোম পর্যবেক্ষণ করতে হবে না' বলছেন তখন আপনি কী উল্লেখ করছেন? জকিউ প্রতিনিধি ডোম নিরীক্ষণ করে না।
redsquare

@ রেডস্কয়ারে আমি এই ধারণার মধ্যে ছিলাম যে ডেলিগেট লাইভের একটি আরও কার্যকর বৈকল্পিক। এটি api.jquery.com/delegate থেকে : "নির্বাচকের সাথে মিলিত হওয়া সমস্ত উপাদানগুলির জন্য এখন বা ভবিষ্যতে মূল উপাদানগুলির একটি নির্দিষ্ট সেটের ভিত্তিতে একটি বা একাধিক ইভেন্টের সাথে একটি হ্যান্ডলার সংযুক্ত করুন" " ভবিষ্যতে বাঁধতে হবে এটা কি মনিটরিং?
জিমিস্টর্মিগ

নাহ এটি ঠিক আপনার উপরের কোডের মত ধারকটিতে প্রতিনিধি ব্যবহার করে। আপনি যদি ধারকটিতে একটি নতুন লি উপাদান sertোকান তবে ধারক ক্লিক ইভেন্টটি এখনও বহিস্কার করা হবে এবং সমস্ত কিছু এখনও কাজ করে। কোনও নিরীক্ষণের প্রয়োজন নেই।
redsquare

@ রেডস্কোয়ার হ্যাঁ, আপনি ঠিক বলেছেন। DOM লোড হওয়ার পরে নতুন উপাদান যুক্ত করা সত্ত্বেও আমার সমাধান কাজ করে। ডেলিগেট যেহেতু অভ্যন্তরীণভাবে লাইভ ব্যবহার করে (দেখুন স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 2954932/… ) এখনও মনে হয় এটি আরও অনুকূলিত তবে কম সুবিধাজনক। তবে আমি যেমন বলেছি, আমার কোনও নম্বর নেই।
জিমিস্টর্মিগ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.