Orlok: JS-Events: Fragen zu Ereignisphasen (Event Phases)

Beitrag lesen

Hallo

Beim durchlesen des entsprechenden WIKI Eintrages

den ich geschrieben und dann halb fertig liegen gelassen habe. Mea culpa! :-)

Warum gibt es eine Capturing- UND eine Bubbling-Phase?

Weil man Entwicklern die Wahl lassen möchte, in welcher Reihenfolge Eventhandler aufgerufen werden, die auf verschiedenen Elementen registriert wurden. Sollen zuerst die Handler aufgerufen werden, die direkt auf dem Zielelement registriert wurden und dann erst die Handler, die weiter oben in der Hierarchie auf einem Elternelement registriert wurden, oder sollen die Handler in umgekehrter Reihenfolge aufgerufen werden? Anwendungen sind vielfältig und man wird vermutlich nicht lange suchen müssen um Beispiele zu finden, wo mal das eine und mal das andere Verhalten gewünscht ist.

Stellen wir uns etwa ein Projekt vor, bei dem eine Komponente der Seite als fertiges Skript eingebunden wird, weil man keine Zeit oder Lust hat sie selbst zu schreiben, oder weil man es ohnehin nicht besser hinbekommen würde. Warum auch immer. Nehmen wir ferner an, dass diese Komponente interaktiv ist, also auf Benutzereingaben reagiert, also Eventhandling betreibt. Nun besteht vielleicht der Wunsch, bei einem Ereignis auf der Komponente eine Aktion durchzuführen, bevor die Komponente selbst darauf reagiert. Zum Beispiel, um Benutzereingaben vorab zu validieren.

Man bekommt aber erst Zugriff auf die Komponente, wenn die internen Handler bereits registriert wurden und da Eventhandler in der Reihenfolge ihrer Registrierung aufgerufen werden, kann man keinen Handler registrieren, der vor den internen Handlern aufgerufen wird. Es sei denn, es gibt so etwas wie eine Capturing–Phase. Diese Ereignisphase gibt uns die Möglichkeit, Eventhandler auf Elementen zu registrieren, die das Eventobjekt auf dem Hinweg zu der Komponente passiert. So kann ein Eventhandler ausgeführt werden, bevor die Komponente von dem Ereignis Kenntnis erlangt.

Umgekehrt ist es auch denkbar, dass man auf einer Seite mehrere interaktive Elemente hat, bei denen es sinnvoll ist, Eventhandler direkt auf den Elementen zu registrieren, um beim Ereigniseintritt spezifische Aktionen auszuführen. Womöglich gibt es aber darüber hinaus noch weitere Aktionen, die für alle diese Elemente ähnlich sind oder die noch weitere Elemente betreffen und die darum bei einem Elternelement weiter oben in der Hierarchie überwacht werden sollen. Wenn nun für die allgemeine Aktion der aktuelle Zustand der Elemente benötigt wird, also die Eventhandler direkt auf den Elementen zwingend vor dem übergeordneten Eventhandler ausgeführt werden müssen, ist man froh, dass es auch eine Bubbling–Phase gibt.

Im Wiki steht weiter:

Wird bei der Registrierung eines Event-Listeners nicht explizit etwas anderes bestimmt, so bezieht sich die Registrierung also grundsätzlich nur auf die Target-Phase und, sofern der Ereignistyp über eine solche verfügt, auf die Bubbling-Phase des Ereignisses.

Ich glaube, das ist nicht richtig.

Ein Event-Listener kann im beschriebenen Fall nur durch Target, ODER (nicht "und") Bubbling ausgelöst werden.

Ja, du hast recht. Das ist etwas unsauber formuliert. Gemeint war, dass eine Registrierung, bei der nicht ausdrücklich angegeben wird, dass die Capturing–Phase überwacht werden soll, standardmäßig für die Target– oder Bubbling–Phase des Events erfolgt. Je nach dem, ob der Eventhandler auf dem Zielelement selbst oder einem Elternelement des Zielelements registriert wird.

Ich habe im Artikel das ‚und‘ mal durch ein ‚oder‘ ersetzt. :-)

Wenn folgendes zutrifft:

Anschließend wird, zumindest bei den allermeisten Ereignistypen, die Liste welche den Ereignispfad darstellt umgedreht, so dass nunmehr das Zielobjekt an erster Stelle und das Fensterobjekt window an letzter Stelle steht. Danach passiert das Ereignisobjekt die Objekte die den Ereignispfad konstituieren noch einmal, nur diesmal in umgekehrter Reihenfolge. Diesen Vorgang nennt man Bubbling, was sich sinngemäß in etwa als aufsteigen übersetzen lässt.

Wäre dann nicht die Target-Phase einfach nur der erste Schritt der Bubbling-Phase

Am ersten Objekt der Liste, dem Zielelement, befindet sich das Eventobjekt zu diesem Zeitpunkt ja bereits. Die Target–Phase endet und das Bubbling beginnt, wenn das Eventobjekt das Zielelement wieder verlässt.

Das ist zwar -zugegeben- Erbsenzählerei, aber dient mir und vielleicht auch jemand anderem dazu, eine klare Idee im Kopf zu haben.

Ich habe den Eindruck, dass du eine klare Idee davon hast. ;-)

In diesem Sinne möchte ich mich auch mal bedanken, für das wiki, welches mir schon öfters die Gedanken in die richtige Richtung gelenkt hat.

Das freut mich zu lesen.

Viele Grüße,

Orlok