माता-पिता के सापेक्ष बच्चे के रूप में तत्व का सूचकांक प्राप्त करें


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
हाय redsquare .. मैं jQuery के साथ अभ्यास कर रहा हूँ, मैं प्रतिनिधि के बारे में n00b हूँ: D .. क्यों प्रतिनिधि सीधे तत्वों पर घटनाओं को संलग्न करने से बेहतर है?
स्टेकब

1
@steweb - हे - क्योंकि एक घटना हैंडलर संभावित रूप से कई के लिए बेहतर है। यदि आप एक सूची के रूप में ऊपर का उपयोग करने के लिए प्रत्येक तत्व पर व्यक्तिगत हैंडलर के बजाय संभव का उपयोग करने की कोशिश करते हैं, तो डोम के लिए घटनाओं को जोड़ना महंगा हो सकता है। एक लेख जो गहराई तक जाता है वह है briancrescimanno.com/2008/05/19/… - साथ ही गूगल 'जावास्क्रिप्ट इवेंट डेलिगेशन'
redsquare

ठीक है, इसलिए, इस तरह से घटनाओं का प्रबंधन करना क्लासिक 'डोम अटैचमेंट' की तुलना में कुछ हल्का है :) .. धन्यवाद!
स्टेकब

@steweb - यह हल्का भी है क्योंकि jquery doesn सभी प्रारंभिक तत्वों की प्रारंभिक खोज करने की आवश्यकता है। यह सिर्फ कंटेनर को देखता है और उस स्तर पर सुनता है कि क्लिक की गई वस्तु ली हुई है या नहीं।
redsquare

यह .index विधि मेरे लिए सुपर सहायक है। मैं छँटाई करने के लिए jQuery सॉर्टेबल का उपयोग कर रहा हूँ, लेकिन यह DOM में अर्थ रैंकिंग जानकारी संग्रहीत करता है। .Index () के साथ, मैं रैंकिंग को वास्तव में साफ तरीके से डोम से बाहर खींच सकता हूं। धन्यवाद!
सिंपलजी

41

कुछ इस तरह:

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

9
महान जोड़ - हम मूल रूप से मूल चयनकर्ता के लिए सूचकांक पा सकते हैं। +1
बेसाल्टर

1
इस जवाब को पसंद करें क्योंकि यह वास्तव में सवाल का जवाब देता है बल्कि उदाहरण के लिए एक संभावित समाधान
डार्कमुक

8

इस उदाहरण पर एक नज़र डालें ।

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

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पहले से नहीं बल्कि हर क्लिक पर s की व्यूह रचना करनी होगी :

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 एक फंक्शन नहीं है
Kareem

2
मेरे उत्तर पर कोई भी कोड स्निपेट उस त्रुटि का उत्पादन नहीं करता - आप उन्हें काम करते देखने के लिए "रन कोड स्निपेट" दबा सकते हैं। यदि आपको वह त्रुटि मिल रही है, तो आप अलग-अलग कोड का उपयोग कर रहे हैं - ऐसा लगता है कि आप jQuery का उपयोग कर रहे हैं, लेकिन मेरा उत्तर यह दिखा रहा है कि jQuery के बिना इस प्रकार की चीज़ को कैसे पूरा किया जाए
SomePerformance

काफी उचित। हां, मैं JQuery का उपयोग कर रहा हूं। धन्यवाद
करीम

3

डेलिगेट और लाइव का उपयोग करना आसान है, लेकिन अगर आपके पास कोई और ली नहीं है: गतिशील रूप से जोड़ा गया तो आप सामान्य बाइंड / क्लिक के साथ ईवेंट ह्रास का उपयोग कर सकते हैं। इस पद्धति का उपयोग करते हुए कुछ प्रदर्शन लाभ होना चाहिए क्योंकि नए मिलान तत्वों के लिए DOM की निगरानी नहीं करनी होगी। कोई वास्तविक संख्या नहीं मिली, लेकिन यह समझ में आता है :)

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

आप इसे jsFiddle: http://jsfiddle.net/jimmysv/4Sfdh/1/ पर देख सकते हैं


1
जब आप यह कहते हैं कि आप इस 'डोम की निगरानी नहीं करेंगे' तो आप क्या कर रहे हैं? jq डेलिगेट डोम की निगरानी नहीं करता है।
redsquare

@redsquare मैं इस धारणा के तहत था कि डेलीगेट लाइव का एक अधिक कुशल संस्करण है। यह api.jquery.com/delegate से है : "रूट तत्वों के एक विशिष्ट सेट के आधार पर चयनकर्ता से मेल खाने वाले सभी तत्वों के लिए एक या एक से अधिक घटनाओं के लिए एक हैंडलर संलग्न करें।" भविष्य में इसे बांधने के लिए निगरानी होनी चाहिए?
१२:१२

नहीं, यह सिर्फ ऊपर दिए गए कोड की तरह कंटेनर पर प्रतिनिधिमंडल का उपयोग करता है। यदि आप कंटेनर में एक नया li तत्व डालते हैं, तो कंटेनर क्लिक ईवेंट अभी भी निकाल दिया जाता है और सब कुछ अभी भी काम करता है। कोई निगरानी की आवश्यकता नहीं है।
redsquare

@redsquare हां, आप सही हैं। अगर डोम लोड होने के बाद नए तत्व जोड़े जाते हैं तो भी मेरा समाधान काम करता है। चूंकि डेलिगेट लाइव आंतरिक रूप से उपयोग करता है (देखें stackoverflow.com/questions/2954932/… ) यह अभी भी ऐसा लगता है कि यह अधिक अनुकूलित है लेकिन कम सुविधाजनक है। लेकिन जैसा कि मैंने कहा, मेरे पास कोई संख्या नहीं है।
jimmystormig

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.