इवेंट बबलिंग और कैप्चरिंग में क्या अंतर है? कैप्चरिंग बनाम बबलिंग का उपयोग कब करना चाहिए?
इवेंट बबलिंग और कैप्चरिंग में क्या अंतर है? कैप्चरिंग बनाम बबलिंग का उपयोग कब करना चाहिए?
जवाबों:
घटना बुदबुदाहट और कैप्चरिंग HTML DOM API में ईवेंट प्रचार के दो तरीके हैं, जब कोई ईवेंट किसी अन्य तत्व के अंदर एक तत्व में होता है, और दोनों तत्वों ने उस ईवेंट के लिए एक हैंडल पंजीकृत किया है। ईवेंट प्रचार मोड यह निर्धारित करता है कि तत्व किस क्रम में ईवेंट प्राप्त करते हैं ।
बुदबुदाहट के साथ, इस घटना को सबसे पहले कैप्चर किया गया और अंतरतम तत्व द्वारा नियंत्रित किया गया और फिर बाहरी तत्वों को प्रचारित किया गया।
कैप्चरिंग के साथ, घटना को सबसे पहले बाहरी तत्व द्वारा कैप्चर किया जाता है और आंतरिक तत्वों को प्रचारित किया जाता है।
कैप्चरिंग को "ट्रिकलिंग" भी कहा जाता है, जो प्रसार क्रम को याद रखने में मदद करता है:
ट्रिकल डाउन, बबल अप
पुराने दिनों में वापस, नेटस्केप ने ईवेंट कैप्चरिंग की वकालत की, जबकि माइक्रोसॉफ्ट ने ईवेंट बुबलिंग को बढ़ावा दिया। दोनों W3C डॉक्यूमेंट ऑब्जेक्ट मॉडल इवेंट्स स्टैंडर्ड (2000) का हिस्सा हैं।
IE <9 केवल इवेंट बबलिंग का उपयोग करता है , जबकि IE9 + और सभी प्रमुख ब्राउज़र दोनों का समर्थन करते हैं। दूसरी ओर, जटिल डोम के लिए घटना बुदबुदाती का प्रदर्शन थोड़ा कम हो सकता है ।
हम addEventListener(type, listener, useCapture)
ईवेंट हैंडलर्स को बबलिंग (डिफ़ॉल्ट) या कैप्चरिंग मोड के लिए रजिस्टर करने के लिए उपयोग कर सकते हैं । कैप्चरिंग मॉडल का उपयोग करने के लिए तीसरा तर्क पास करें true
।
<div>
<ul>
<li></li>
</ul>
</div>
उपरोक्त संरचना में, मान लें कि li
तत्व में एक क्लिक ईवेंट हुआ ।
कैप्चरिंग मॉडल में, ईवेंट को div
पहले हैंडल किया जाएगा (ईवेंट हैंडलर को div
पहले आग में क्लिक करें ), उसके ul
बाद फिर टार्गेट एलिमेंट में आखिरी में li
।
बुदबुदाहट मॉडल में, इसके विपरीत होगा: घटना को पहले तत्व द्वारा और li
उसके बाद तत्व ul
द्वारा नियंत्रित किया जाएगा div
।
अधिक जानकारी के लिए देखें
नीचे दिए गए उदाहरण में, यदि आप किसी हाइलाइट किए गए तत्वों पर क्लिक करते हैं, तो आप देख सकते हैं कि ईवेंट प्रचार प्रवाह का कैप्चरिंग चरण पहले होता है, उसके बाद बबलिंग चरण।
var logElement = document.getElementById('log');
function log(msg) {
logElement.innerHTML += ('<p>' + msg + '</p>');
}
function capture() {
log('capture: ' + this.firstChild.nodeValue.trim());
}
function bubble() {
log('bubble: ' + this.firstChild.nodeValue.trim());
}
function clearOutput() {
logElement.innerHTML = "";
}
var divs = document.getElementsByTagName('div');
for (var i = 0; i < divs.length; i++) {
divs[i].addEventListener('click', capture, true);
divs[i].addEventListener('click', bubble, false);
}
var clearButton = document.getElementById('clear');
clearButton.addEventListener('click', clearOutput);
p {
line-height: 0;
}
div {
display:inline-block;
padding: 5px;
background: #fff;
border: 1px solid #aaa;
cursor: pointer;
}
div:hover {
border: 1px solid #faa;
background: #fdd;
}
<div>1
<div>2
<div>3
<div>4
<div>5</div>
</div>
</div>
</div>
</div>
<button id="clear">clear output</button>
<section id="log"></section>
triclkling
रूप में ही है capturing
? के बारे में Crockford वार्ता Trickling v. Bubbling
इस वीडियो को बात-चीत में - youtube.com/watch?v=Fv9qT9joc0M&list=PL7664379246A246CB चारों ओर 1 hr 5 minutes
।
trickle down
=> onElement
=>bubble up
विवरण:
quirksmode.org का अच्छा वर्णन है। संक्षेप में (quirksmode से कॉपी किया गया):
इवेंट कैप्चरिंग
जब आप ईवेंट कैप्चरिंग का उपयोग करते हैं
| | ---------------| |----------------- | element1 | | | | -----------| |----------- | | |element2 \ / | | | ------------------------- | | Event CAPTURING | -----------------------------------
एलिमेंट 1 का ईवेंट हैंडलर पहले फायर करता है, एलिमेंट 2 का ईवेंट हैंडलर आखिरी बार फायर करता है।
घटना बुदबुदाई
जब आप इवेंट बबलिंग का उपयोग करते हैं
/ \ ---------------| |----------------- | element1 | | | | -----------| |----------- | | |element2 | | | | | ------------------------- | | Event BUBBLING | -----------------------------------
एलिमेंट 2 का ईवेंट हैंडलर पहले फायर करता है, एलिमेंट 1 का ईवेंट हैंडलर आखिरी बार फायर करता है।
क्या उपयोग करें?
यह आप पर निर्भर करता है की आप क्या करना चाहते हो। कोई बेहतर नहीं है। अंतर घटना संचालकों के निष्पादन का क्रम है। अधिकांश समय बुदबुदाती अवस्था में ईवेंट हैंडलर्स को फायर करना ठीक रहेगा लेकिन पहले उन्हें फायर करना भी आवश्यक हो सकता है।
यदि दो तत्व तत्व 1 और तत्व 2 हैं। तत्व 2 तत्व 1 के अंदर है और हम एक घटना हैंडलर को दोनों तत्वों के साथ संलग्न करते हैं जो ऑनक्लिक को कहते हैं। अब जब हम तत्व 2 पर क्लिक करते हैं तो दोनों तत्वों के लिए इवेंटहैंडलर निष्पादित किया जाएगा। अब यहां यह प्रश्न है कि किस क्रम में घटना को अंजाम दिया जाएगा। यदि तत्व 1 के साथ जुड़ी हुई घटना पहले निष्पादित होती है, तो इसे इवेंट कैप्चरिंग कहा जाता है और यदि तत्व 2 से जुड़ी घटना पहले निष्पादित होती है, तो इसे इवेंट बबलिंग कहा जाता है। W3C के अनुसार ईवेंट कैप्चरिंग चरण में शुरू होगा जब तक कि यह लक्ष्य तक वापस नहीं पहुंच जाता है तब तक यह तत्व वापस आ जाता है और फिर यह बुदबुदाती है
कैप्चरिंग और बबलिंग स्टेट्स addEventListener विधि के यूज़कैपचर पैरामीटर द्वारा जाने जाते हैं
eventTarget.addEventListener (प्रकार, श्रोता, [, useCapture]);
डिफ़ॉल्ट रूप से उपयोग गलत है। इसका मतलब यह बुदबुदाती अवस्था में है।
var div1 = document.querySelector("#div1");
var div2 = document.querySelector("#div2");
div1.addEventListener("click", function (event) {
alert("you clicked on div 1");
}, true);
div2.addEventListener("click", function (event) {
alert("you clicked on div 2");
}, false);
#div1{
background-color:red;
padding: 24px;
}
#div2{
background-color:green;
}
<div id="div1">
div 1
<div id="div2">
div 2
</div>
</div>
कृपया सही और गलत को बदलने का प्रयास करें।
the event will start in the capturing phase untill it reaches the target comes back to the element and then it starts bubbling
। मैंने केवल addEventListener का पैरामीटर पाया है useCapture
जिसे सही या गलत पर सेट किया जा सकता है; और HTML 4.0 में, इवेंट श्रोताओं को एक तत्व की विशेषताओं के रूप में निर्दिष्ट किया गया था और useCapture defaults to false
। क्या आप उस युक्ति से लिंक कर सकते हैं जो पुष्टि करती है कि आपने क्या लिखा है?
मैंने इस विषय को समझाने में javascript.info पर इस ट्यूटोरियल को बहुत स्पष्ट पाया है । और अंत में इसके 3-बिंदु सारांश वास्तव में महत्वपूर्ण बिंदुओं पर बात कर रहे हैं। मैं इसे यहाँ उद्धृत करता हूँ:
- घटनाओं को पहले गहन लक्ष्य तक ले जाया जाता है, फिर बबल अप किया जाता है। IE <9 में वे केवल बबल करते हैं।
- सभी हैंडलर बुबलिंग स्टेज पर काम करते हैं , जो
addEventListener
अंतिम तर्क के साथtrue
होता है, जो इवेंट को कैप्चरिंग स्टेज पर पकड़ने का एकमात्र तरीका है।- Bubbling / कैप्चरिंग को
event.cancelBubble=true
(IE) याevent.stopPropagation()
अन्य ब्राउज़रों के लिए रोका जा सकता है।
ऐसी Event.eventPhase
संपत्ति भी है जो आपको बता सकती है कि क्या घटना निशाने पर है या कहीं और से आती है।
ध्यान दें कि ब्राउज़र संगतता अभी तक निर्धारित नहीं है। मैंने इसे क्रोम (66.0.3359.181) और फ़ायरफ़ॉक्स (59.0.3) पर परीक्षण किया और यह वहां समर्थित है।
स्वीकृत उत्तर से पहले से ही महान स्निपेट पर विस्तार , यह eventPhase
संपत्ति का उपयोग करके आउटपुट है
var logElement = document.getElementById('log');
function log(msg) {
if (logElement.innerHTML == "<p>No logs</p>")
logElement.innerHTML = "";
logElement.innerHTML += ('<p>' + msg + '</p>');
}
function humanizeEvent(eventPhase){
switch(eventPhase){
case 1: //Event.CAPTURING_PHASE
return "Event is being propagated through the target's ancestor objects";
case 2: //Event.AT_TARGET
return "The event has arrived at the event's target";
case 3: //Event.BUBBLING_PHASE
return "The event is propagating back up through the target's ancestors in reverse order";
}
}
function capture(e) {
log('capture: ' + this.firstChild.nodeValue.trim() + "; " +
humanizeEvent(e.eventPhase));
}
function bubble(e) {
log('bubble: ' + this.firstChild.nodeValue.trim() + "; " +
humanizeEvent(e.eventPhase));
}
var divs = document.getElementsByTagName('div');
for (var i = 0; i < divs.length; i++) {
divs[i].addEventListener('click', capture, true);
divs[i].addEventListener('click', bubble, false);
}
p {
line-height: 0;
}
div {
display:inline-block;
padding: 5px;
background: #fff;
border: 1px solid #aaa;
cursor: pointer;
}
div:hover {
border: 1px solid #faa;
background: #fdd;
}
<div>1
<div>2
<div>3
<div>4
<div>5</div>
</div>
</div>
</div>
</div>
<button onclick="document.getElementById('log').innerHTML = '<p>No logs</p>';">Clear logs</button>
<section id="log"></section>