JavaScript/DOM/Event/stopImmediatePropagation

Aus SELFHTML-Wiki
< JavaScript‎ | DOM‎ | Event
Wechseln zu: Navigation, Suche

Der Aufruf der Methode stopImmediatePropagation der Schnittstelle Event des Document Object Models verhindert, dass weitere für diesen Ereignistyp registrierte Handlerfunktionen aufgerufen werden.

Syntax:

event.stopImmediatePropagation( )


Während die Methode stopPropagation lediglich dafür sorgt, dass keine für andere Objekte registrierten Handlerfunktionen mehr aufgerufen werden, das Ereignis also nicht weiter durch das DOM propagiert, verhindert die Methode stopImmediatePropagation zudem auch den Aufruf von solchen Eventhandlern, die für das selbe Objekt registriert wurden wie die Handlerfunktion, in welcher der Methodenaufruf notiert wurde.

Anwendung der Methode stopImmediatePropagation
var foo = function (e) {
  e.stopImmediatePropagation( );
  console.log('foo invoked');
};

var bar = function ( ) {
  console.log('bar invoked');
};

document.body.addEventListener('click', foo);
document.body.addEventListener('click', bar);

Hier haben wir zunächst zwei Funktionen notiert mit den Bezeichnern foo und bar, welche bei ihrem Aufruf einen kurzen Text in die Konsole schreiben sollen, welcher ihren Aufruf bestätigt. Darüber hinaus haben wir für das Element body zwei Event-Listener für den Ereignistyp click registriert, wobei wir das body-Element über die gleichnamige Eigenschaft des Dokumentobjektes addressiert haben. Schließlich wird bei den beiden Aufrufen der Methode addEventListener jeweils eine Referenz auf die zuvor notierten Funktionen als Argument übergeben, sodass diese beim Eintritt des Ereignisses aufgerufen werden.

Würden wir nun durch einen Klick innerhalb von body dafür sorgen, dass das click-Event feuert, dann würde dies normalerweise dazu führen, dass beide Handlerfunktionen aufgerufen werden und demnach nacheinander die beiden Bestätigungen des Funktionsaufrufs in die Konsole geschrieben werden.

Dies geschieht an dieser Stelle nun jedoch nicht, da wir in der Funktion foo auf dem automatisch als Argument übergebenen Event-Objekt die Methode stopImmediatePropagation aufgerufen haben, wodurch die weitere Ausbreitung des Ereignisses auch auf demselben Objekt, hier also body, unterbunden wird. Da die Registrierung des Event-Listeners für die Rückruffunktion bar nach derjenigen für die Funktion foo erfolgt ist und die Event-Listener beim Eintritt des entsprechenden Ereignisses grundsätzlich in der Reihenfolge aufgerufen werden in der sie registriert wurden, wird hier also lediglich die Bestätigung des Aufrufs von foo in die Konsole geschrieben.

Unterschied zwischen stopImmediatePropagation und stopPropagation
var condition = 0;

document.body.addEventListener('click', function (e) {
  if (condition === 1) {
    e.stopPropagation( );
  } else if (condition === 2) {
    e.stopImmediatePropagation( );
  }
  console.log('A');
});

document.body.addEventListener('click', function ( ) {
  console.log('B');
});

document.documentElement.addEventListener('click', function ( ) {
  console.log('C');
});


In diesem Beispiel wird zunächst eine Variable mit dem Bezeichner condition und dem Wert 0 definiert. Weiterhin werden drei Event-Listener für das Ereignis click registriert, deren Callback jeweils eine anonyme Funktion ist, wobei die ersten beiden Eventhandler analog zum ersten Beispiel für das body-Element registriert werden und der dritte für das html-Element, welches über die Eigenschaft mit dem Bezeichner documentElement des Dokumentobjektes referenziert wird. Jede Rückruffunktion enthält hier die Anweisung, einen String in die Konsole zu schreiben. Innerhalb der zuerst notierten Funktion ist darüber hinaus eine bedingte Anweisung enthalten, welche dafür sorgt, dass beim Funktionsaufruf je nach Wert der Variable condition entweder die Methode stopPropagation, die Methode stopImmediatePropagation oder aber keine der beiden Methoden aufgerufen wird.

Im obigen Beispiel wurde der Variable condition also der Wert 0 zugewiesen, sodass innerhalb der ersten für body registrierten Handlerfunktion keine der beiden Methoden aufgerufen wird und folgerichtig nacheinander A, B und C in die Konsole geschrieben wird. Dabei ist in diesem Zusammenhang zu beachten, dass der für das html-Element registrierte Eventhandler nicht deshalb zuletzt aufgerufen wird weil er nach den anderen beiden Eventhandlern registriert wurde, sondern weil das Ereignis click hier in seiner Bubbling-Phase abgefangen wird und daher zuerst das body-Element passiert, bevor es zu dessen Elternelement html gelangt. Hätten wir bei der Registrierung des Event-Listeners für das html-Element also ein drittes Argument mit dem Wert true übergeben, so wäre diese Rückruffunktion zuerst aufgerufen worden, da in diesem Fall das Event in seiner Capturing-Phase abgefangen würde und es die Elemente entsprechend in umgekehrter Reihenfolge passiert hätte.

Jedenfalls, würden wir nun der Variable condition den Wert 1 zuweisen und mithin dafür sorgen, dass innerhalb der zuerst notierten Funktion die Methode stopPropagation aufgerufen wird, dann würde für das Ereignis intern das stop propagation flag gesetzt, was dazu führen würde, dass nach dem Aufruf der zweiten für das Body-Element hinterlegten Handlerfunktion der Algorithmus terminiert und der für das Html-Element registrierte Event-Listener mithin nicht mehr erreicht würde, sodass hierbei lediglich A und B in dies Konsole geschrieben würden, nicht jedoch C.

Würden wir der Variable schließlich den Wert 2 zuweisen, so würde intern nicht nur das stop propagation flag, sondern zudem auch das stop immediate propagation flag des Events gesetzt werden, mit dem Ergebnis, dass von der zuerst registrierten Handlerfunktion abgesehen überhaupt keine anderen Funktionen mehr aufgerufen werden, weder der zweite für body registrierte Eventhandler noch die für das Element html hinterlegte Rückruffunktion, sodass infolgedessen lediglich A in die Konsole geschrieben würde.

Weblinks