wahsaga: Event Flow im DOM Level 2 Event Model

Beitrag lesen

Hi Mathias,

Die Spezifikation scheint mir supertriviale Dinge superverklausuliert zu formulieren.

:-)

Ich verstehe das ganz grundsätzlich:
Beim Capturing sage ich erstmal: Fange bei document.body alle Events vom Typ x ab.
Ich sage nicht: Fange bei document.body alle Events gleich welchen Types ab, deren Ziel das Element mit der ID »blub« ist.

document.body hier vermutlich nur als Beispiel?
Denn abfangen muss ich ja nicht dort, sondern kann ich bei jedem Knoten, der in der DOM-Hierarchie einen Vorfahr des Elements, auf dem der Event (inital) stattfindet, darstellt.

Die Grafik unter http://www.mediaevent.de/javascript/event_listener.html, zweiter Abschnitt, stellt es mir recht simplifiziert und verständlich dar.
Der aufgetretene Event wird vom Wurzelelement (document) aus zum Kindknoten heruntergereicht, und auf diesem Weg wird geschaut, ob es "Observer" gibt, die eine Eventbehandlung mit useCapture=true haben.
Anschliessend geht's beim Bubbling dann vom EventTarget wieder in die andere Richtung rauf bis zur Wurzel.

OK, bis hier hin war's ja eigentlich auch vorher schon klar.
Nur einige Details waren mir halt in der Spezifikation zu unverständlich.

Wird jeder Handler auf dem Element Target ausgeführt, egal ob mit useCapture true oder false registriert? Oder nur die mit false?

Sehr wichtige Frage!

Antwort mit DOM 3 Events: Nur die mit useCapture=false!

Vielleicht hätte ich mir gleich DOM 3 Events anschauen sollen, anstatt Level 2 ...
Ich werd' da noch mal reinschauen, in wie fern mir dort die in Level 2 unklaren Stellen spezifischer erscheinen.

Dass Eventlistener, die einem Element während der Abarbeitung des Events auf eben diesem Element hinzugefügt werden, in der gleichen Phase nicht berücksichtigt werden dürfen, scheint ja dort zumindest schon mal gleich geblieben zu sein.

Wenn ich einem Element einen Handler für die Capturing-Phase registriere und das Element ist tatsächliches Ziel eines Events, darf der Handler (gemäß DOM 3 Events) *nicht* ausgeführt werden.

Danke, diese explizite Aussage fehlte mir zum Beispiel in der Level 2-Version.

Jetzt sag nicht, »Firefox, Safari und Konqueror feuern aber auch den Handler mit useCapture=true!« - Ja, stimmt, aber die machen das alle falsch. Nur Opera machts richtig. :-)
[...]
useCapture=true heißt also: Nur den Handler auslösen, wenn der Event in der Capture-Phase am Knoten vorbeikommt.
useCapture=false heißt also: Den Handler auslösen, wenn der Event in der Bubbling-Phase am Knoten vorbeikommt ODER der Event beim Knoten die Target-Phase durchmacht.

:-/
Na dann muss ich mir überlegen, was ich dem IE beibringe - "richtiges" Vorgehen nach Spezifikation, oder Orientierung an Gecko &. Co.

Ach, ich sehe gerade, in der offiziellen Definition steht das auch ;)

Vielleicht sollte ich das per Flag wählbar machen ... Orientierung an der Praxis (Gecko-Verhalten emulieren), oder an der Theorie.

gruß,
wahsaga

--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }