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 EventListener
verhindern soll, dass das Ereignis weiter verarbeitet wird, kann sie die stopPropagation
Methode der
Event
Schnittstelle aufrufen . Dies verhindert einen weiteren Versand des Ereignisses, obwohl zusätzliche, EventListeners
die 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
stopPropagation
nicht aufgerufen wurden, löst das Ereignis das entsprechende EventListeners
auf dem Ziel selbst aus.
Für sprudelnde Ereignisse :
Jeder Ereignishandler kann eine weitere Ereignisausbreitung verhindern, indem er die stopPropagation
Methode der Event
Schnittstelle aufruft . Wenn jemand
EventListener
diese Methode aufruft, werden alle zusätzlichen EventListeners
Daten des Stroms EventTarget
ausgelöst, aber das Sprudeln hört auf dieser Ebene auf. Es ist nur ein Anruf stopPropagation
erforderlich, um ein weiteres Sprudeln zu verhindern.
Für die Absage von Veranstaltungen :
Cancelation wird erreicht , indem der Aufruf Event
s‘ preventDefault
Methode. Wenn ein oder mehrere EventListeners
Anrufe preventDefault
wä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.stop
Funktion tun ... Auch seltsam, dass ich damit nie Probleme hatte. Ich benutze viel Sprudeln. Danke für das Beispiel!