प्रत्यायोजित ईवेंट हैंडलर के मामले में, जहां आपके पास कुछ इस तरह हो सकता है:
<ul>
<li data-id="1">
<span>Item 1</span>
</li>
<li data-id="2">
<span>Item 2</span>
</li>
<li data-id="3">
<span>Item 3</span>
</li>
<li data-id="4">
<span>Item 4</span>
</li>
<li data-id="5">
<span>Item 5</span>
</li>
</ul>
और आपका जेएस कोड ऐसा है:
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target),
itemId = $target.data('id');
//do something with itemId
});
});
आप संभावना से अधिक पाएंगे कि आइटमआईडी है undefined
, क्योंकि एलआई की सामग्री को एक में लपेटा गया है <span>
, जिसका अर्थ है कि <span>
संभवतः घटना लक्ष्य होगा। आप इसे एक छोटी सी जाँच के साथ प्राप्त कर सकते हैं, जैसे:
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target).is('li') ? $(event.target) : $(event.target).closest('li'),
itemId = $target.data('id');
//do something with itemId
});
});
या, यदि आप पठनीयता को अधिकतम करना चाहते हैं (और jQuery रैपिंग कॉल के अनावश्यक पुनरावृत्ति से भी बचें):
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target),
itemId;
$target = $target.is('li') ? $target : $target.closest('li');
itemId = $target.data('id');
//do something with itemId
});
});
ईवेंट डेलिगेशन का उपयोग करते समय, .is()
विधि यह सत्यापित करने के लिए अमूल्य है कि आपका ईवेंट लक्ष्य (अन्य चीजों के बीच) वास्तव में वही है जो आपको होना चाहिए। .closest(selector)
DOM ट्री को सर्च करने के लिए प्रयोग करें , और नीचे सर्च करने के लिए .find(selector)
(आम तौर पर कपल के साथ .first()
, इन .find(selector).first()
) का उपयोग करें। उपयोग करते .first()
समय आपको उपयोग करने की आवश्यकता नहीं है .closest()
, क्योंकि यह केवल पहले मिलान वाले पूर्वज तत्व को .find()
लौटाता है , जबकि सभी मिलान वाले वंशज देता है।