Ereignis Bubbling ist ein Begriff, den Sie auf Ihren JavaScript -Reisen möglicherweise begegnet haben. Es bezieht sich auf die Reihenfolge, in der Ereignishandler aufgerufen werden, wenn ein Element in einem zweiten Element verschachtelt ist, und beide Elemente haben einen Hörer für dasselbe Ereignis registriert (zum Beispiel ein Klick).
Aber das Ereignisblasen ist nur ein Stück Puzzleteil. Es wird oft in Verbindung mit der Ereigniserfassung und der Ereignisverbreitung erwähnt. Und ein festes Verständnis aller drei Konzepte ist für die Arbeit mit Ereignissen in JavaScript von wesentlicher Bedeutung - zum Beispiel, wenn Sie das Ereignisdelegationsmuster implementieren möchten.
In diesem Beitrag werde ich jeden dieser Begriffe erklären und zeigen, wie sie zusammenpassen. Ich werde Ihnen auch zeigen, wie ein grundlegendes Verständnis des JavaScript-Ereignisflusses Ihnen eine feinkörnige Kontrolle über Ihre Anwendung geben kann. Bitte beachten Sie, dass dies kein Grund für Ereignisse ist, daher wird eine Vertrautheit mit dem Thema angenommen. Wenn Sie mehr über Ereignisse im Allgemeinen erfahren möchten, lesen Sie unser Buch: JavaScript: Novice to Ninja.
Beginnen wir mit der Ereignisausbreitung. Dies ist der pauschale Begriff für Ereignisse und Ereigniserfassungen. Betrachten Sie das typische Markup, um eine Liste mit verknüpften Bildern für eine Miniaturansichten zu erstellen, z. B.
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>
Ein Klick auf ein Bild generiert nicht nur ein Klickereignis für das entsprechende IMG das Fensterobjekt.
In der DOM -Terminologie ist das Bild das Ereignisziel , das innerste Element, über das der Klick stammt. Das Ereignisziel sowie seine Vorfahren, von seinem Elternteil bis zum Fensterobjekt, bilden einen Zweig im Dom -Baum. In der Bildergalerie besteht beispielsweise dieser Zweig aus den Knoten: IMG, A, Li, UL, Body, HTML, Dokument, Fenster.
Beachten Sie, dass das Fenster nicht eigentlich ein DOM -Knoten ist, sondern die EventTarget -Schnittstelle implementiert. Daher handeln wir es so, als wäre es der übergeordnete Knoten des Dokumentobjekts.
Dieser Zweig ist wichtig, da er der Weg ist, an dem sich die Ereignisse ausbreiten (oder fließen). Diese Ausbreitung ist der Prozess, mit dem alle Hörer für den angegebenen Ereignistyp aufgerufen werden, der an die Knoten auf dem Zweig angeschlossen ist. Jeder Hörer wird mit einem Ereignisobjekt aufgerufen, das Informationen sammelt, die für das Ereignis relevant sind (dazu später mehr).
Denken Sie daran, dass mehrere Hörer für denselben Ereignisart auf einem Knoten registriert werden können. Wenn die Ausbreitung einen solchen Knoten erreicht, werden die Zuhörer in der Reihenfolge ihrer Registrierung aufgerufen.
Es sollte auch angemerkt werden, dass die Bestimmung der Zweige statisch ist, dh sie wird beim ersten Versand des Ereignisses festgelegt. Baumänderungen während der Ereignisverarbeitung werden ignoriert.
Die Ausbreitung ist bidirektional vom Fenster zum Ereignisziel und zurück. Diese Ausbreitung kann in drei Phasen unterteilt werden:
Was diese Phasen unterscheidet, ist die Art von Zuhörern, die genannt werden.
In dieser Phase werden nur die Capturer Zuhörer aufgerufen, nämlich diejenigen Hörer, die unter Verwendung eines Werts von TRUE für den dritten Parameter von AddEventListener registriert wurden:
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>
Wenn dieser Parameter weggelassen wird, ist sein Standardwert falsch und der Hörer ist kein Kapitur.
In dieser Phase werden also nur die Kapiturer auf dem Pfad vom Fenster zum Ereignisziel -Elternteil aufgerufen.
In dieser Phase werden alle auf dem Ereignisziel registrierten Hörer aufgerufen, unabhängig vom Wert ihres Capture Flags.
Während der Ereignisspurphase werden nur die Nichtkäufer aufgerufen. Das heißt
el<span>.addEventListener('click', listener, true) </span>
Ziel Phase.
Daher wurde am Ende der Ausbreitung jeder Hörer auf dem Zweig genau einmal genannt.Event Bubbling findet nicht für jede Art von Veranstaltung statt. Während der Ausbreitung ist es für einen Hörer möglich zu wissen, ob ein Ereignis durch das Lesen der booleschen Eigenschaft des Ereignisobjekts bubbles.
Die drei Ereignisflussphasen sind im folgenden Diagramm aus der W3C -Uievents -Spezifikation dargestellt.
Copyright © 2016 World Wide Web Consortium, (MIT, Ercim, Keio, Beihang).
Ich habe bereits die Eigenschaft. Es gibt eine Reihe anderer Eigenschaften, die von diesem Objekt bereitgestellt werden, die den Hörern zur Verfügung stehen, um auf Informationen zugreifen zu können.
Lassen Sie uns die oben genannten Konzepte in die Praxis ansehen. Im folgenden Stift befinden sich fünf verschachtelte Quadratkästen namens B0… B4. Anfangs ist nur die äußere Box B0 sichtbar; Die inneren zeigen, wenn der Mauszeiger über sie schwebt. Wenn wir auf ein Feld klicken, wird in der Tabelle rechts ein Protokoll des Ausbreitungsflusss angezeigt.
Siehe den Stift JMXDPZ von sitepoint (@sinepoint) auf CodePen.
Es ist sogar möglich, außerhalb der Felder zu klicken: In diesem Fall ist das Ereignisziel das Körper- oder HTML -Element, abhängig vom Speicherort auf dem Bildschirm.
Die Ereignisausbreitung kann in jedem Hörer gestoppt werden, indem die StopPropagation -Methode des Ereignisobjekts aufgerufen wird. Dies bedeutet, dass alle auf den Knoten auf dem Ausbreitungspfad registrierten Zuhörer, die dem aktuellen Ziel folgen, nicht aufgerufen werden. Stattdessen erhalten alle anderen am aktuellen Ziel angehängten verbleibenden Hörer das Ereignis weiter.
Wir können dieses Verhalten mit einer einfachen Gabel der vorherigen Demo überprüfen und nur einen Aufruf an StopPropagation () in einem der Zuhörer einfügen. Hier haben wir diesen neuen Hörer als Kapitur in der Liste der im Fenster registrierten Rückrufe vorbereitet:
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>
Auf diese Weise bleibt die Ausbreitung frühzeitig angehalten und erreicht nur die Capturer -Hörer im Fenster.
Wie unter seinem Namen angegeben, verhindern StopimmediatePropagation die Bremsen sofort und verhindert, dass selbst die Geschwister des aktuellen Hörers das Ereignis erhalten. Wir können dies mit einer minimalen Änderung des letzten Stifts sehen:
<span><span><span><ul</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span> ... <span><span><span><li</span>></span><span><span><a</span> href<span>="..."</span>></span><span><span><img</span> src<span>="..."</span> alt<span>=""</span>></span><span><span></a</span>></span> </span><span><span><span></ul</span>></span> </span>
Jetzt wird in der Protokolltabelle nichts ausgegeben, weder die C1- und C2 -Fensterkapiturer zählen, da die Ausbreitung nach der Ausführung des neuen Hörers aufhört.
Einige Ereignisse sind einer Standardaktion verbunden, die der Browser am Ende der Ausbreitung ausführt. Zum Beispiel führt das Klicken auf ein Link -Element oder das Klicken auf eine Schaltfläche "Auf eine Formulierung" bewirkt, dass der Browser zu einer neuen Seite navigiert oder das Formular sendet.
Es ist möglich, die Ausführung solcher Standardaktionen mit der Ereignisstornierung zu vermeiden, indem eine weitere Methode des Ereignisobjekts, E.PreventDefault, in einem Hörer aufgerufen wird.
Ich hoffe, dass ich Ihnen gezeigt habe, wie Ereignisse sprudeln und Ereignisse in JavaScript erfassen. Wenn Sie Fragen oder Kommentare haben, würde ich sie gerne in der folgenden Diskussion hören.
Dieser Artikel wurde Peer von Yaphi Berhanu und Dominic Myers überprüft. Vielen Dank an alle Peer -Rezensenten von SitePoint, die SitePoint -Inhalte so gut wie möglich gemacht haben!
Ereignis.StopPropagation ();
}); sprudeln nicht zu seinen übergeordneten Elementen. Wenn Sie beispielsweise ein übergeordnetes Element mit mehreren untergeordneten Elementen haben und auf ein bestimmtes Ereignis mit all diesen Elementen zuhören möchten, können Sie den Event -Hörer dem Elternteil aufstellen und das Ereignis sprudeln. Auf diese Weise sprudelt es beim Auslösen des Ereignisses auf den Kinderelementen zum Elternteil und Sie können es dort umgehen.Wie kann ich überprüfen, ob ein Ereignis sprudelt oder nicht? Bubbles Eigenschaft des Ereignisobjekts. Diese Eigenschaft gibt einen booleschen Wert zurück, der angibt, ob die Ereignis durch das DOM blüht oder nicht. ) Methoden werden verwendet, um die Ausbreitung des Ereignisses zu stoppen. Der Unterschied besteht darin, dass StopPropagation () das Ereignis daran hindert, die Ereigniskette aufzusprudeln, während StopimmediatePropagation () verhindert, dass andere Hörer desselben Ereignisses aufgerufen werden.
Das obige ist der detaillierte Inhalt vonEreignis in JavaScript sprudeln? Ereignisausbreitung erklärt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!