Wie funktioniert das Sprudeln von Ereignissen im Allgemeinen und ist es ein Synonym für Ereignisausbreitung?

11

Ich versuche, mich mit den allgemeinen Funktionsweisen und Prinzipien des Event-Dispatchings in ereignisgesteuerten (Sub-) Systemen zu beschäftigen.

Obwohl ich es schon einige Male verwendet habe, zum Beispiel in Javascript, Flash (Actionscript 2 und 3) und sogar ein einfaches Event-Dispatching-System in PHP für mich selbst erstellt habe, habe ich Event-Bubbling und / oder nie wirklich verstanden Ausbreitung so gut.

Erste Frage:
Ist Ereignisblasen ein Synonym für Ereignisausbreitung?

Zweite Frage:
Stimmt es, dass ein Ereignis, wenn es "sprudelt", bedeutet, dass es in der Hierarchie der Objekte "verschoben" wird?

Dritte und wichtigste Frage:
Wenn mein Verständnis in Frage 2 richtig ist; Wie wird die Hierarchie der allgemein implementierten Objekte "nach oben" verschoben?
Bedeutet dies im Allgemeinen, dass das übergeordnete Objekt dasselbe Ereignis an sein übergeordnetes Objekt "erneut verteilt" (bis es das Stammobjekt erreicht)? Und wenn; Müssen all diese Objekte in der Hierarchie auf ihre Kinder für diese Ereignisse hören, oder fehlt mir ein wichtiges Prinzip in meinem Verständnis von Ereignisblasen, bei dem es nicht erforderlich ist, dass das übergeordnete Objekt sie selbst als Zuhörer von Ereignissen mit untergeordneten Objekten registriert?

Wenn Sie diese Grundprinzipien anhand eines einfachen Pseudocodes veranschaulichen könnten, wäre ich mehr als dankbar.

Anständiger Dabbler
quelle
1
Ein verwandter Artikel: Event order
Jonas

Antworten:

7

Erste Frage: Ist Ereignisblasen ein Synonym für Ereignisausbreitung?

Nein. Blasenbildung ist eine Form der Ereignisausbreitung, kann jedoch nicht als Synonym verwendet werden. Ausbreitung ist ein allgemeiner Begriff für die Weitergabe eines Ereignisses. Blasenbildung ist eine spezifische Strategie der Ereignisausbreitung.

Zweite Frage: Bin ich in meinem Verständnis richtig, dass ein Ereignis, wenn es "sprudelt", bedeutet, dass es in der Hierarchie der Objekte "verschoben" wird?

Ja. Bubbling bedeutet, dass die Hierarchie nach oben geht, im Gegensatz zum Tunneln , dh vom obersten Element nach unten oder vom Routing , was bedeutet, dass das nächste Objekt, das das Ereignis empfängt, alles sein kann, was Sie auswählen.

Dritte und wichtigste Frage: Wenn mein Verständnis in Frage 2 richtig ist; Wie wird die Hierarchie der allgemein implementierten Objekte "nach oben" verschoben?

Ziemlich einfach. In Ihrer visuellen Hierarchie haben die Steuerelemente einen Verweis auf das übergeordnete Element / das visuelle Element der obersten Ebene oder können ihn irgendwo abrufen. Wenn sie also ein Ereignis erfassen, benachrichtigen sie nur das übergeordnete Ereignis, das das übergeordnete Element darüber benachrichtigt usw.

Pseudocode ist für jedes UI-Steuerelement wie folgt:

OnEvent(SomeEvent event)
{
   CallHandlersForEvent(event);
   if(HasParent && event.ContinueBubbling == true)
   {
       Parent.OnEvent(event);
   }
}

Wie Blueberryfields sagte, muss es nicht der direkte Elternteil sein, der das Ereignis als nächstes erhält. Sie könnten auch so implementieren:

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}
Falke
quelle
+1 Der Pseudocode macht für mich sehr viel Sinn, danke! (Wie übrigens auch der Rest Ihrer Antwort.)
Decent Dabbler
@fireeyedboy: Gern geschehen =)
Falcon
1

Erste Antwort:

Ereignisblasenbildung ist ein spezifischer Algorithmus, der die Ereignisausbreitung steuert.

Zweite Antwort:

Nein, das Sprudeln hängt nicht unbedingt mit einer Hierarchie zusammen. Wie Objekte intern oder anderswo dargestellt werden, spielt keine Rolle, damit der Algorithmus ordnungsgemäß funktioniert. Wenn ein Ereignis sprudelt, dehnt es sich im Idealfall vom innersten sichtbaren Element auf dem Bildschirm nach außen bis zum äußersten sichtbaren Element auf dem Bildschirm aus.

Dritte Antwort:

Die Implementierungsdetails können sehr unterschiedlich sein, je nachdem, wie die Interna der einzelnen (Browser) implementiert sind. Der bubblingAlgorithmus hängt von der Darstellung auf dem Bildschirm ab. Wenn ein Kapselungselement in der Vererbungshierarchie höher ist als ein inneres Element, kann das Sprudeln beispielsweise unter Verwendung von Standardvererbungsmechanismen in der Sprache implementiert werden. Dies ist jedoch nicht unbedingt der Fall. Möglicherweise verfügen Sie über einen speziellen Mechanismus, mit dem sowohl interne Strukturen als auch deren Sichtbarkeit auf dem Bildschirm interpretiert und Ereignisse gemäß dem Algorithmus weitergegeben werden können, während die interne Organisation ignoriert wird.

Blaubeerfelder
quelle
1
Warum sagen Sie: "Sprudeln ist nicht unbedingt mit einer Hierarchie verbunden". Meiner Meinung nach ist es. Ohne Hierarchie gibt es kein Sprudeln. Es muss eine Art Baum geben. Können Sie ein Beispiel für das Sprudeln ohne Baumstruktur nennen? Ihr Beispiel "vom innersten zum äußersten sichtbaren Element" ist genau das - eine visuelle Hierarchie.
Falcon
1
Sicher, Sie können es als Hierarchie interpretieren, wenn Sie wirklich wollen. Ich stelle es mir lieber als lose gekoppelten Graphen vor, der einige visuelle und einige nicht visuelle Elemente enthält.
blueberryfields
2
Aber dann scheitert die sprudelnde Analogie. Denn in einem Diagramm kann das Ereignis überall weitergeleitet werden, während das Sprudeln deutlich von unten nach oben verläuft.
Falcon
Ich denke, man kann es nicht mehr als Sprudeln in einem beliebigen Graphen bezeichnen. Es muss dann "Event Routing" genannt werden, dann imho.
Falcon
1
Ich glaube, Falcon macht einige faire Punkte. Klingt vernünftig, sich das Sprudeln als etwas vorzustellen, das sich nach oben bewegt (eine Hierarchie).
Anständiger Dabbler