365 Stimmen

Der Parameter useCapture in addEventListener kann nicht verstanden werden

Ich habe den Artikel gelesen unter https://developer.mozilla.org/en/DOM/element.addEventListener aber unfähig zu verstehen useCapture Attribut. Es gibt eine Definition:

Bei "true" zeigt useCapture an, dass der Benutzer die Erfassung einleiten möchte. Nach dem Einleiten der Erfassung werden alle Ereignisse des angegebenen Typs an den registrierten Listener weitergeleitet, bevor sie an alle darunter liegenden EventTargets im DOM-Baum weitergeleitet werden. Ereignisse, die sich im Baum nach oben bewegen, lösen keinen Listener aus, der für die Verwendung von Capture bestimmt ist.

In diesem Code wird das übergeordnete Ereignis vor dem untergeordneten Ereignis ausgelöst, so dass ich nicht in der Lage bin, das Ereignis zu verstehen. Dokument-Objekt hat usecapture wahr und Kind div hat usecapture falsch gesetzt und Dokument usecapture gefolgt ist.so warum Dokument-Eigenschaft über Kind bevorzugt wird.

function load() {
  document.addEventListener("click", function() {
    alert("parent event");
  }, true);

  document.getElementById("div1").addEventListener("click", function() {
    alert("child event");
  }, false);
}

<body onload="load()">
  <div id="div1">click me</div>
</body>

12voto

NilColor Punkte 3392

Es dreht sich alles um Veranstaltungsmodelle: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow Sie können das Ereignis in der Blasenbildungsphase oder in der Erfassungsphase einfangen. Sie haben die Wahl.
Werfen Sie einen Blick auf http://www.quirksmode.org/js/events_order.html - Sie werden es sehr nützlich finden.

12voto

shadowBot Punkte 119

Code-Beispiel:

<div id="div1" style="background:#9595FF">
  Outer Div<br />
  <div id="div2" style="background:#FFFFFF">
    Inner Div
  </div>
</div>

Javascript-Code:

d1 = document.getElementById("div1");
d2 = document.getElementById("div2");

wenn beide auf false gesetzt sind

d1.addEventListener('click',function(){alert("Div 1")},false);
d2.addEventListener('click',function(){alert("Div 2")},false);

Führt aus: Wenn Sie auf Inner Div klicken, werden die Warnungen wie folgt angezeigt: Div 2 > Div 1

Hier wird das Skript vom inneren Element aus ausgeführt: Event Bubbling (useCapture wurde auf false gesetzt)

div 1 wird auf true und div 2 auf false gesetzt

d1.addEventListener('click',function(){alert("Div 1")},true);
d2.addEventListener('click',function(){alert("Div 2")},false);

Führt aus: Wenn Sie auf Inner Div klicken, werden die Warnungen wie folgt angezeigt: Div 1 > Div 2

Hier wird das Skript vom Vorgängerelement / äußeren Element aus ausgeführt: Event Capturing (useCapture wurde auf true gesetzt)

div 1 wird auf false und div 2 auf true gesetzt

d1.addEventListener('click',function(){alert("Div 1")},false);
d2.addEventListener('click',function(){alert("Div 2")},true);

Führt aus: Wenn Sie auf Inner Div klicken, werden die Warnungen wie folgt angezeigt: Div 2 > Div 1

Hier wird das Skript vom inneren Element aus ausgeführt: Event Bubbling (useCapture wurde auf false gesetzt)

div 1 wird auf true und div 2 auf true gesetzt

d1.addEventListener('click',function(){alert("Div 1")},true);
d2.addEventListener('click',function(){alert("Div 2")},true);

Führt aus: Wenn Sie auf Inner Div klicken, werden die Warnungen wie folgt angezeigt: Div 1 > Div 2

Hier wird das Skript vom Vorgängerelement / äußeren Element aus ausgeführt: Event Capturing seit useCapture auf true gesetzt wurde

10voto

Aurimas Punkte 2297

Angesichts der drei Phasen des Ereignisses Reisen :

  1. En Aufnahmephase : Das Ereignis wird an die Vorfahren des Ziels weitergeleitet. Knotens.
  2. En Zielphase : Das Ereignis wird an den Zielknoten weitergeleitet.
  3. En Blasenbildungsphase : Das Ereignis wird an die Vorfahren des Zielknotens gesendet, vom direkten Elternteil des Zielknotens bis zur Wurzel des Baumes.

useCapture gibt an, für welche Phasen das Ereignis Reisen stattfinden wird:

Si true , useCapture i nur für die Erfassungsphase hinzufügen möchte, d. h. dieser Ereignis-Listener wird nicht während der Ziel- und Bubbling-Phase ausgelöst wird. Wenn false , die Ereignis-Listener wird nur während der Ziel- und Bubbling-Phase ausgelöst Phasen

Die Quelle ist dieselbe wie bei der zweitbesten Antwort: https://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-phases

3voto

WXB13 Punkte 1026

Die Reihenfolge der Definition spielt nur dann eine Rolle, wenn sich die Elemente auf derselben Ebene befinden. Wenn Sie die Reihenfolge der Definitionen in Ihrem Code umkehren, erhalten Sie die gleichen Ergebnisse.

Wenn Sie jedoch die useCapture-Einstellung für die beiden Event-Handler umkehren, reagiert der Child-Event-Handler vor dem Parent-Event-Handler. Der Grund dafür ist, dass der Child-Event-Handler nun in der Capture-Phase ausgelöst wird, die vor der Bubbling-Phase liegt, in der der Parent-Event-Handler ausgelöst wird.

Wenn Sie useCapture für beide Ereignishandler auf true setzen - unabhängig von der Reihenfolge der Definition - wird der übergeordnete Ereignishandler zuerst ausgelöst, da er in der Erfassungsphase vor dem untergeordneten kommt.

Wenn Sie dagegen useCapture für beide Event-Handler auf false setzen - wiederum unabhängig von der Reihenfolge der Definition - wird der Child-Event-Handler zuerst ausgelöst, da er in der Bubbling-Phase vor dem Parent-Handler kommt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X