मुझे लगता है आपके सवाल का .on
की Event Delegation संस्करण के बारे में है।
जावास्क्रिप्ट में, सबसे घटनाओं bubble डोम पदानुक्रम में ऊपर। इसका मतलब है, जब एक घटना जो तत्व के लिए आग लगती है, तो यह document
स्तर तक डीओएम तक पहुंच जाएगी।
इस बुनियादी मार्कअप पर विचार करें:
<div>
<span>1</span>
<span>2</span>
</div>
अब हम घटना प्रतिनिधिमंडल लागू होते हैं:
$('div').on('click', 'span', fn);
ईवेंट हैंडलर div
तत्व को पूरी तरह से जुड़ा हुआ है। span
div
के अंदर हैं, फैला में कोई भी क्लिक करेंगे बुलबुला div
अप करने के लिए, div
के क्लिक हैंडलर फायरिंग। उस पल में, जो कुछ बचा है, यह जांच रहा है कि event.target
(या लक्ष्य के बीच के किसी भी तत्व और delegateTarget
) प्रतिनिधिमंडल लक्ष्य चयनकर्ता से मेल खाता है या नहीं।
के एक सा अधिक जटिल बना दो:
<div id="parent">
<span>1</span>
<span>2 <b>another nested element inside span</b></span>
<p>paragraph won't fire delegated handler</p>
</div>
बुनियादी तर्क इस प्रकार है:
//attach handler to an ancestor
document.getElementById('parent').addEventListener('click', function(e) {
//filter out the event target
if (e.target.tagName.toLowerCase() === 'span') {
console.log('span inside parent clicked');
}
});
हालांकि जब event.target
अपने फिल्टर के अंदर नेस्टेड है ऊपर से मेल नहीं खाएगी। के रूप में jQuery के .on
करता है केवल वंशज तत्वों के लिए अपडेट कर कोड:
document.getElementById('parent').addEventListener('click', function(e) {
var failsFilter = true,
el = e.target;
while (el !== this && (failsFilter = el.tagName.toLowerCase() !== 'span') && (el = el.parentNode));
if (!failsFilter) {
console.log('span inside parent clicked');
}
});
Fiddle
संपादित करें: हम कुछ यात्रा तर्क की जरूरत है।
नोट: ये स्निपेट व्याख्यात्मक उद्देश्यों के लिए हैं, वास्तविक दुनिया में उपयोग नहीं किए जाते हैं। जब तक आप पुराने आईई का समर्थन करने की योजना नहीं बनाते हैं, बेशक। पुराने IE के लिए आप इस तरह की जाँच घटना वस्तु वैश्विक दायरे में समारोह या उपलब्ध हैंडलर के लिए पारित किया गया है या नहीं के रूप में addEventListener
/attachEvent
के साथ-साथ event.target || event.srcElement
, और संभवतः के खिलाफ परीक्षण सुविधा के लिए कुछ अन्य quirks की आवश्यकता होगी। शुक्र है कि jQuery हमारे लिए दृश्यों के पीछे निर्बाध रूप से सभी करता है।=]
अच्छी तरह से यह सब ठीक है
शायद ज़रुरत किसी में पर JQuery को बदलने के लिए/वेनिला-जावास्क्रिप्ट के साथ रहती जरूरत jQuery के बारे में और jQuery.on() का उपयोग कैसे करें, मुझे दिलचस्पी है कि केवल जावास्क्रिप्ट और डोम पर एक समान स्निपेट लिखना संभव है? –
@Zlatan हां यह है। हालांकि बिना झुकाव के आपके पास कई फैंसी प्रतिनिधिमंडल चयनकर्ता नहीं होंगे। मैं एक शुद्ध जेएस एक उदाहरण जोड़ दूंगा। –
ठीक है। खैर मुझे लगता है कि आप इसके साथ एक उदाहरण लिख सकते हैं: 'document.querySelector()' या 'document.querySelectorAll()' :) –