සිදුවීම් බුබුලු ගැසීම සහ අල්ලා ගැනීම යනු කුමක්ද?


1051

සිදුවීම් බුබුලු දැමීම සහ අල්ලා ගැනීම අතර වෙනස කුමක්ද? අල්ලා ගැනීමට එදිරිව බුබුලු භාවිතා කළ යුත්තේ කවදාද?


2
මෙම ප්‍රයෝජනවත් සබැඳිය මම නිර්දේශ කරමි: javascript.info/bubbling-and-capturing
ප්‍රජා Ans

M ප්‍රජාව: මෙම වෙබ් අඩවිය විශිෂ්ටයි, නමුත් මෙම මාතෘකාව විශේෂයෙන් ව්‍යාකූල ආකාරයකින් නිරූපණය කෙරේ.
Veverke

Answers:


1461

සිදුවීම් බුබුලු ගැසීම සහ අල්ලා ගැනීම යනු 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>

JSFiddle හි තවත් උදාහරණයක් .


42
useCaptureදැන් IE> = 9 හි සහය දක්වයි. source
beatgammit

7
මම අදහස් නමුත් ලස්සන ලිපිය මම මෙහි දක්නට දමා එහි ප්රමාද දැන catcode.com/domcontent/events/capture.html
යන්තම් කේතය

3
වන triclklingලෙස එම capturing? ක්‍රොක්ෆර්ඩ් Trickling v. Bubblingමෙම වීඩියෝ කතාවේදී කතා කරයි - youtube.com/watch?v=Fv9qT9joc0M&list=PL7664379246A246CB අවට 1 hr 5 minutes.
කෙවින් මෙරඩිත්

1
E කෙවින්මරිඩිත් එකම දේ. "උපක්‍රම" මඟින් මාදිලි දෙක කරන්නේ කුමක්ද යන්න මතක තබා ගැනීම පහසු කරයි ( පහළට තල්ලු කරන්න , බුබුල ඉහළට ).
බළලෙක්

7
සවිස්තරාත්මක පැහැදිලි කිරීමෙහි අනුපිළිවෙල සම්බන්ධයෙන් ඉහත පිළිතුර නිවැරදි ය, නමුත් දෙවනුව සිදුවන්නේ "බුබුල ඉහළට, පහළට තල්ලු කරන්න" යනුවෙනි. සිදුවීම් සෑම විටම බුබුලු අවධියට පෙර අල්ලා ගැනීමේ අදියර හරහා ගමන් කරයි. නිවැරදි ඇණවුම trickle down=> onElement=>bubble up
ධාවනය වන

518

විස්තර:

quirksmode.org හි මේ පිළිබඳව හොඳ විස්තරයක් ඇත. කෙටියෙන් කිවහොත් (quirksmode වෙතින් පිටපත් කරන ලදි):

සිදුවීම් අල්ලා ගැනීම

ඔබ සිදුවීම් අල්ලා ගැනීම භාවිතා කරන විට

               | |
---------------| |-----------------
| element1     | |                |
|   -----------| |-----------     |
|   |element2  \ /          |     |
|   -------------------------     |
|        Event CAPTURING          |
-----------------------------------

මූලද්‍රව්‍ය 1 හි සිදුවීම් හසුරුවන්නා පළමුව ගිනි ගනී, මූලද්‍රව්‍යය 2 හි සිදුවීම් හසුරුවන්නා අවසන් වරට ගිනි ගනී.

සිදුවීම් බුබුලු දැමීම

ඔබ සිදුවීම් බුබුලු භාවිතා කරන විට

               / \
---------------| |-----------------
| element1     | |                |
|   -----------| |-----------     |
|   |element2  | |          |     |
|   -------------------------     |
|        Event BUBBLING           |
-----------------------------------

මූලද්‍රව්‍ය 2 හි සිදුවීම් හසුරුවන්නා පළමුව ගිනි ගනී, මූලද්‍රව්‍ය 1 හි සිදුවීම් හසුරුවන්නා අවසන් වරට ගිනි ගනී.


භාවිතා කළ යුත්තේ කුමක්ද?

එය ඔබට කිරීමට අවශ්‍ය දේ මත රඳා පවතී. මීට වඩා හොඳ දෙයක් නැත. වෙනස වන්නේ සිදුවීම් හසුරුවන්නන් ක්‍රියාත්මක කිරීමේ අනුපිළිවෙලයි. බොහෝ විට සිදුවීම් හසුරුවන්නන් බුබුලු දැමීමේ අවධියේදී වෙඩි තැබීම හොඳ වනු ඇති නමුත් කලින් වෙඩි තැබීමද අවශ්‍ය වේ.


දෙකම සිදු නොවේ, පළමුව අල්ලා ගැනීම සහ පසුව බුබුලු දැමීම, පිටත් කර යැවීමේ සිදුවීම යනු කුමක්ද?
සුරාජ් ජේන්

චිත්‍රක උදාහරණයක් මෙහි ඇත: javascript.info/bubbling-and-capturing
ප්‍රජා Ans

72

මූලද්රව්ය 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>

කරුණාකර සත්‍ය සහ අසත්‍ය වෙනස් කිරීමට උත්සාහ කරන්න.


2
aster මාස්ටර්සිලෝ: ෆිදෙල් අවශ්‍ය නොවේ, ස්ටැක් ඕවර්ෆ්ලෝ දැන් පේළිගත කේතයට සහය දක්වයි .
ඩෑන් ඩස්කල්ස්කු

සම්බන්ධයෙන් 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. ඔබ ලියා ඇති දේ සනාථ කරන පිරිවිතරයකට සම්බන්ධ විය හැකිද?
රළ පහර

25

මෙම නිබන්ධනය javascript.info හි මෙම මාතෘකාව පැහැදිලි කිරීමේදී ඉතා පැහැදිලි බව මට පෙනී ගොස් ඇත. එහි ලකුණු 3 සාරාංශය අවසානයේ තීරණාත්මක කරුණු සමඟ කථා කරයි. මම එය මෙහි උපුටා දක්වන්නෙමි:

  1. සිදුවීම් පළමුව ගැඹුරුතම ඉලක්කය දක්වා අල්ලා ගනු ලැබේ, පසුව බුබුල ඉහළට. IE <9 හි ඒවා බුබුලු පමණි.
  2. addEventListenerඅන්තිම තර්කය හැරුණු විට සියලුම හසුරුවන්නන් බුබුලු වේදිකාවේ වැඩ කරයි true, මෙය වේදිකාව අල්ලා ගැනීමේදී සිදුවීම අල්ලා ගැනීමට ඇති එකම ක්‍රමයයි.
  3. event.cancelBubble=true(IE) හෝ event.stopPropagation() වෙනත් බ්‍රව්සර් සඳහා බුබුලු දැමීම / අල්ලා ගැනීම නතර කළ හැකිය .

7

ද තියෙනවා 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>


4

බුබුලු දැමීම

  Event propagate to the upto root element is **BUBBLING**.

අල්ලා ගැනීම

  Event propagate from body(root) element to eventTriggered Element is **CAPTURING**.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.