Terminologie
Von quirksmode.org :
Ereigniserfassung
Wenn Sie die Ereigniserfassung verwenden
| |
--------------- | | -----------------
| element1 | | |
| ----------- | | ----------- |
| | element2 \ / | |
| ------------------------- |
| Ereignis ERFASSUNG |
-----------------------------------
Der Ereignishandler von Element1 wird zuerst ausgelöst, der Ereignishandler von Element2 wird zuletzt ausgelöst.
Ereignis sprudelt
Wenn Sie Ereignisblasen verwenden
/ \.
--------------- | | -----------------
| element1 | | |
| ----------- | | ----------- |
| | element2 | | | |
| ------------------------- |
| Ereignis BUBBLING |
-----------------------------------
Der Ereignishandler von Element2 wird zuerst ausgelöst, der Ereignishandler von Element1 wird zuletzt ausgelöst.
Jedes Ereignis, das im W3C-Ereignismodell stattfindet, wird zuerst erfasst, bis es das Zielelement erreicht, und sprudelt dann wieder hoch .
| | / \.
----------------- | | - | | -----------------
| element1 | | | | |
| ------------- | | - | | ----------- |
| | element2 \ / | | | |
| -------------------------------- |
| W3C-Ereignismodell |
--------------------------------------
Schnittstelle
Von w3.org zur Ereigniserfassung :
Wenn die Erfassung EventListenerverhindern soll, dass das Ereignis weiter verarbeitet wird, kann sie die stopPropagationMethode der
EventSchnittstelle aufrufen . Dies verhindert einen weiteren Versand des Ereignisses, obwohl zusätzliche, EventListenersdie auf derselben Hierarchieebene registriert sind, das Ereignis weiterhin erhalten. Sobald die stopPropagation
Methode eines Ereignisses aufgerufen wurde, haben weitere Aufrufe dieser Methode keine zusätzlichen Auswirkungen. Wenn keine zusätzlichen Capturer vorhanden sind und
stopPropagationnicht aufgerufen wurden, löst das Ereignis das entsprechende EventListenersauf dem Ziel selbst aus.
Für sprudelnde Ereignisse :
Jeder Ereignishandler kann eine weitere Ereignisausbreitung verhindern, indem er die stopPropagationMethode der EventSchnittstelle aufruft . Wenn jemand
EventListenerdiese Methode aufruft, werden alle zusätzlichen EventListenersDaten des Stroms EventTargetausgelöst, aber das Sprudeln hört auf dieser Ebene auf. Es ist nur ein Anruf stopPropagationerforderlich, um ein weiteres Sprudeln zu verhindern.
Für die Absage von Veranstaltungen :
Cancelation wird erreicht , indem der Aufruf Events‘ preventDefault
Methode. Wenn ein oder mehrere EventListenersAnrufe preventDefaultwährend einer Phase des Ereignisflusses getätigt werden, wird die Standardaktion abgebrochen.
Beispiele
In den folgenden Beispielen löst ein Klick auf den Hyperlink im Webbrowser den Ereignisfluss (die Ereignis-Listener werden ausgeführt) und die Standardaktion des Ereignisziels aus (eine neue Registerkarte wird geöffnet).
HTML:
<div id="a">
<a id="b" href="http://www.google.com/" target="_blank">Google</a>
</div>
<p id="c"></p>
JavaScript:
var el = document.getElementById("c");
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
}
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
}
function bubblingOnClick1(ev) {
el.innerHTML += "DIV event bubbling<br>";
}
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
}
// The 3rd parameter useCapture makes the event listener capturing (false by default)
document.getElementById("a").addEventListener("click", capturingOnClick1, true);
document.getElementById("b").addEventListener("click", capturingOnClick2, true);
document.getElementById("a").addEventListener("click", bubblingOnClick1, false);
document.getElementById("b").addEventListener("click", bubblingOnClick2, false);
Beispiel 1 : Es ergibt sich die Ausgabe
DIV event capture
A event capture
A event bubbling
DIV event bubbling
Beispiel 2 : Hinzufügen stopPropagation()zur Funktion
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.stopPropagation();
}
führt zur Ausgabe
DIV event capture
Der Ereignis-Listener verhinderte eine weitere Ausbreitung des Ereignisses nach unten und oben. Die Standardaktion (das Öffnen einer neuen Registerkarte) wurde jedoch nicht verhindert.
Beispiel 3 : Hinzufügen stopPropagation()zur Funktion
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
ev.stopPropagation();
}
oder die Funktion
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
ev.stopPropagation();
}
führt zur Ausgabe
DIV event capture
A event capture
A event bubbling
Dies liegt daran, dass beide Ereignis-Listener auf demselben Ereignisziel registriert sind. Die Ereignis-Listener verhinderten eine weitere Ausbreitung des Ereignisses nach oben. Sie haben jedoch die Standardaktion (das Öffnen einer neuen Registerkarte) nicht verhindert.
Beispiel 4 : preventDefault()Zum Beispiel zu einer beliebigen Funktion hinzufügen
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.preventDefault();
}
verhindert, dass sich eine neue Registerkarte öffnet.
event.stopFunktion tun ... Auch seltsam, dass ich damit nie Probleme hatte. Ich benutze viel Sprudeln. Danke für das Beispiel!