Event-Capturing
Don P
- javascript
Hallo,
Mal zwei Verständnisfragen zum Event-Capuring:
Ein Event ist ja immer auf ein sog. target, d.h. ein Zielelement gerichtet, und pflanzt sich von dort im DOM-Baum bis zum Wurzelelement fort (bubbling), falls er nicht unterwegs aufgehalten wird (stopPropagation/cancelBubble).
Wie ist es dann aber in der sog. capuring phase? Stimmt das so: Ein Event steigt immer zuerst vom Wurzelelement zum Zielelement ab, so dass z.B. ein onclick-Handler für die capuring phase im document immer als erster zum Zug kommt, egal wohin man klickt?
Wenn ja: Kann man bereits beim "feuern" eines Events angeben, dass er gar nicht erst absteigen soll? Ich meine, wenn ich nur bubbling will, ist eine capturing phase doch unnötig und frisst evtl. nur Performance...
Danke und Gruß,
Don P
Mal zwei Verständnisfragen zum Event-Capuring:
Literatur
http://www.quirksmode.org/js/events_order.html
MSIE sagt bubbling,
Netscape sagt capturing
W3C sagt: sowohl als auch!
Die Sache ist, dass du bei addEventListener ja pro Element angibst, ob nun an diesem Element während der capturing oder bubbling Phase deine dem Event zugeordnete Funktion ausgelöst wird.
Erachte aber zwei Elemente, ein Parent und ein Kind davon, und beide haben den gleichen Event regsitriert.
Deshalb müssen beide Phasen durchlaufen werden.
mfg Beat
Hallo,
Literatur
http://www.quirksmode.org/js/events_order.html
MSIE sagt bubbling,
Netscape sagt capturing
W3C sagt: sowohl als auch!
Ah super. Der Artikel ist gut. Da bleiben keine Fragen offen :)
Danke, Don P
Literatur
http://www.quirksmode.org/js/events_order.html
MSIE sagt bubbling,
Netscape sagt capturing
W3C sagt: sowohl als auch!Ah super. Der Artikel ist gut. Da bleiben keine Fragen offen :)
Es freut mich, dass Links auch angenommen werden.
Natürlich kann man nur die Bubbling-Phase canceln, nicht aber die Capturing Phase.
mfg Beat
http://www.quirksmode.org/js/events_order.html
Natürlich kann man nur die Bubbling-Phase canceln, nicht aber die Capturing Phase.
Auch wenn das dort steht, es ist falsch.
<!doctype html>
<script>
[code lang=javascript]window.onload = function () {
document.addEventListener('click', documentClicked, true);
document.getElementById('a').addEventListener('click', aClicked, false);
function documentClicked (e) {
e.stopPropagation();
}
function aClicked (e) {
alert('a clicked');
}
};
</script>
<p id="a">aaa</p>[/code]
Das geht in allen Browsern, die W3C DOM Events unterstützen (einschließlich IE9 Beta).
Mathias
Hallo,
Das geht in allen Browsern, die W3C DOM Events unterstützen (einschließlich IE9 Beta).
Das klingt gut. Dann kann man Events für viele children ggf. schon im Elternelement abfangen :).
Gruß, Don P
Ein Event steigt immer zuerst vom Wurzelelement zum Zielelement ab, so dass z.B. ein onclick-Handler für die capuring phase im document immer als erster zum Zug kommt, egal wohin man klickt?
Richtig.
- Wenn ja: Kann man bereits beim "feuern" eines Events angeben, dass er gar nicht erst absteigen soll?
Ja, mit eventObjekt.stopPropagation().