සිදුවීම් බුබුලු දැමීම සහ අල්ලා ගැනීම අතර වෙනස කුමක්ද? අල්ලා ගැනීමට එදිරිව බුබුලු භාවිතා කළ යුත්තේ කවදාද?
සිදුවීම් බුබුලු දැමීම සහ අල්ලා ගැනීම අතර වෙනස කුමක්ද? අල්ලා ගැනීමට එදිරිව බුබුලු භාවිතා කළ යුත්තේ කවදාද?
Answers:
සිදුවීම් බුබුලු ගැසීම සහ අල්ලා ගැනීම යනු HTML DOM API හි සිදුවීම් ප්රචාරණය කිරීමේ ක්රම දෙකකි, වෙනත් මූලද්රව්යයක් තුළ මූලද්රව්යයක සිදුවීමක් සිදු වූ විට, මූලද්රව්ය දෙකම එම සිදුවීම සඳහා හසුරුව ලියාපදිංචි කර ඇත. සිදුවීම් ප්රචාරණ මාදිලිය මඟින් සිදුවීම ලැබෙන්නේ කුමන අනුපිළිවෙලටද යන්න තීරණය කරයි .
බුබුලු ගැසීමත් සමඟ, සිදුවීම මුලින්ම ග්රහණය කර හසුරුවනු ලබන්නේ අභ්යන්තරයේ ඇති මූලද්රව්යයෙනි.
අල්ලා ගැනීමත් සමඟ, සිදුවීම පළමුව පිටත මූලද්රව්යය විසින් ග්රහණය කර අභ්යන්තර මූලද්රව්ය වෙත ප්රචාරණය කරනු ලැබේ.
අල්ලා ගැනීම "උපක්රම" ලෙසද හැඳින්වේ, එය ප්රචාරණ අනුපිළිවෙල මතක තබා ගැනීමට උපකාරී වේ:
පහළට තල්ලු කරන්න, බුබුල ඉහළට
පැරණි දිනවල, නෙට්ස්කේප් විසින් සිදුවීම් ග්රහණය කර ගැනීම වෙනුවෙන් පෙනී සිටි අතර මයික්රොසොෆ්ට් විසින් සිදුවීම් බුබුලු දැමීම ප්රවර්ධනය කළේය. දෙකම W3C ලේඛන වස්තු ආකෘති සිදුවීම් ප්රමිතියේ (2000) කොටසකි .
IE <9 භාවිතා කරන්නේ සිදුවීම් බුබුලු පමණක් වන අතර IE9 + සහ සියලුම ප්රධාන බ්රව්සර් දෙකම සඳහා සහය දක්වයි. අනෙක් අතට, සංකීර්ණ DOM සඳහා සිදුවීම් බුබුලේ ක්රියාකාරිත්වය තරමක් අඩු විය හැකිය .
අපි භාවිතා කළ හැකිය 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>
useCapture
දැන් IE> = 9 හි සහය දක්වයි. source
triclkling
ලෙස එම capturing
? ක්රොක්ෆර්ඩ් 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 ක් තිබේ නම් මූලද්රව්යය 2 මූලද්රව්යය තුළ ඇති අතර අපි මූලද්රව්ය දෙකම සමඟ සිදුවීම් හසුරුවන්නෙකු අමුණන්න. දැන් අපි මූලද්රව්යය 2 මත ක්ලික් කළ විට මූලද්රව්ය දෙකම සඳහා eventHandler ක්රියාත්මක වේ. දැන් මෙහිදී ප්රශ්නය වන්නේ සිදුවීම ක්රියාත්මක වන්නේ කුමන අනුපිළිවෙලටද යන්නයි. 1 වන මූලද්රව්යය සමඟ අමුණා ඇති සිදුවීම පළමුව ක්රියාත්මක වන්නේ නම් එය සිදුවීම් ග්රහණය කිරීම ලෙස හැඳින්වෙන අතර මූලද්රව්ය 2 සමඟ අමුණා ඇති සිදුවීම පළමුව ක්රියාත්මක වන්නේ නම් මෙය සිදුවීම් බුබුලු ලෙස හැඳින්වේ. ඩබ්ලිව් 3 සී අනුව, ඉලක්කය කරා ළඟා වන තෙක් එය අල්ලා ගැනීමේ අදියරේදී මූලද්රව්යය වෙත නැවත පැමිණ එය බුබුලු ගැසීමට පටන් ගනී
අල්ලා ගැනීම සහ බුබුලු දැමීමේ තත්වයන් addEventListener ක්රමයේ useCapture පරාමිතිය මගින් දනී
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
, මෙය වේදිකාව අල්ලා ගැනීමේදී සිදුවීම අල්ලා ගැනීමට ඇති එකම ක්රමයයි.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>