Wofür ist das Falsche am Ende? Vielen Dank.
window.addEventListener('load', function() {
alert("All done");
}, false);
Wofür ist das Falsche am Ende? Vielen Dank.
window.addEventListener('load', function() {
alert("All done");
}, false);
Antworten:
Laut MDN Web Docs lautet der dritte Parameter:
useCapture
Wenntrue,useCapturezeigt an, dass der Benutzer - Capture initiieren möchte. Nach dem Starten der Erfassung werden alle Ereignisse des angegebenen Typs an den registriertenlistenergesendet, bevor sie an alleEventTargetdarunter liegenden im DOM-Baum gesendet werden. Ereignisse, die durch den Baum nach oben sprudeln, lösen keinen Listener aus, der für die Verwendung der Erfassung vorgesehen ist. Eine ausführliche Erläuterung finden Sie unter DOM Level 3-Ereignisse .
Ich habe auch MDN überprüft, aber ich habe immer noch nicht verstanden, wofür das useCapturewar. Daher ist diese Antwort für diejenigen gedacht, die sie nach Überprüfung der offiziellen Dokumentation immer noch nicht erhalten.
Zuallererst passiert also in fast allen Browsern Folgendes:
In allen Browsern außer IE <9 gibt es zwei Stufen der Ereignisverarbeitung.
Das Ereignis geht zuerst aus - das nennt man Erfassen und sprudelt dann hoch . Dieses Verhalten ist in der W3C-Spezifikation standardisiert.
useCaptureDies bedeutet , dass diese beiden Ereignisphasen unabhängig von der Einstellung immer vorhanden sind.
Dieses Bild zeigt, wie es funktioniert.

Nach diesem Modell ist die Veranstaltung:
Erfasst nach unten - bis 1 -> 2 -> 3.
Blasen hoch - durch 3 -> 2 -> 1.
Dann kommt deine Frage. Der dritte aufgerufene Parameter useCapturegibt an, in welcher der beiden Phasen Ihr Handler das Ereignis behandeln soll.
useCapture = trueDer Handler befindet sich in der Erfassungsphase. Ereignisse werden es erreichen, bevor es zu seinen Kindern kommt.
useCapture = false.Der Handler befindet sich in der Blasenphase. Ereignisse werden es erreichen, nachdem sie seine Kinder erreicht haben.
Was bedeutet, wenn Sie Code wie folgt schreiben:
child.addEventListener("click", second);
parent.addEventListener("click", first, true);
Wenn Sie auf das untergeordnete Element klicken, wird die firstMethode zuvor aufgerufen second.
Standardmäßig wird die useCapturewird Flag zu setzen falsch , dh Sie Handler wird nur während der Veranstaltung aufgerufen wird sprudelnde Phase.
Für detaillierte Informationen klicken Sie auf diesen Referenzlink und diesen .
Die Antwort von @ Libra ist sehr gut, es gibt zufällig einige Leute wie mich, die die Interaktion des Codes mit der Maschine besser verstehen.
Das folgende Skript sollte daher die Ereignisausbreitung erläutern. Ich versuche anhand dieses Beschreibungsschemas
Folgendes zu tun : Nach dem Ereignisfluss wird die folgende Hierarchie nach unten und oben verschoben:
<window>
<document>
<body>
<section>
<div>
<paragraph>
<span>
Der Einfachheit halber beginnen wir am Body bis zu den Span-Element-Registrierungshandlern für die Erfassungsphase und zurück zu den Body-Element-Registrierungshandlern für die Blasenphase. Das Ergebnis wäre also Knoten für Knoten die Richtung, in die das Ereignis vom Anfang bis zum Ende geht. Klicken Sie im rechten Bereich des Snippets auf "Konsole anzeigen", um auf die Protokolle zuzugreifen
function handler(e){
/* logs messages of each phase of the event flow associated with
the actual node where the flow was passing by */
if ( e.eventPhase == Event.CAPTURING_PHASE ){
console.log ("capturing phase :\n actual node : "+this.nodeName);
}
if ( e.eventPhase == Event.AT_TARGET){
console.log( "at target phase :\n actual node : "+this.nodeName);
}
if ( e.eventPhase == Event.BUBBLING_PHASE){
console.log ("bubbling phase :\n actual node : "+this.nodeName );
}
}
/* The following array contains the elements between the target (span and you can
click also on the paragraph) and its ancestors up to the BODY element, it can still
go up to the "document" then the "window" element, for the sake of simplicity it is
chosen to stop here at the body element
*/
arr=[document.body,document.getElementById("sectionID"),
document.getElementById("DivId"),document.getElementById("PId"),
document.getElementById("spanId")];
/* Then trying to register handelers for both capturing and bubbling phases
*/
function listener(node){
node.addEventListener( ev, handler, bool )
/* ev :event (click), handler : logging the event associated with
the target, bool: capturing/bubbling phase */
}
ev="click";
bool=true; // Capturing phase
arr.forEach(listener);
bool=false; // Bubbling phase
/* Notice that both capturing and bubbling
include the at_target phase, that's why you'll get two `at_target` phases in
the log */
arr.forEach(listener);
p {
background: gray;
color:white;
padding: 10px;
margin: 5px;
border: thin solid black
}
span {
background: white;
color: black;
padding: 2px;
cursor: default;
}
<section ID="sectionID">
<div id="DivId">
<p id="PId">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis <span id="spanId">CLICK ME </span> imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosq.
</p>
</div>
</section>
Beachten Sie, dass Ereignisse wie der Fokus nicht sprudeln, was immer noch Sinn macht, dass die meisten Ereignisse sprudeln.