stopPropagation vs. stopImmediatePropagation

314

Was ist der Unterschied zwischen event.stopPropagation()und event.stopImmediatePropagation()?

Arjun
quelle

Antworten:

321

stopPropagationwird verhindert , dass alle Eltern von Handler ausgeführt wird stopImmediatePropagationkeine übergeordneten Handler verhindern wird und auch keine anderen aus Handler ausführt

Kurzes Beispiel aus der jquery-Dokumentation:

$("p").click(function(event) {
  event.stopImmediatePropagation();
});

$("p").click(function(event) {
  // This function won't be executed
  $(this).css("background-color", "#f00");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p>example</p>

Beachten Sie, dass hier die Reihenfolge der Ereignisbindung wichtig ist!

Dave
quelle
1
Sie betonen "Eltern", aber in Wirklichkeit hören beide auch auf, Kinder zu betreten, wenn sie in der Erfassungsphase aufgerufen werden! Siehe meine Antwort für Details.
Robert Siemer
57

Ein kleines Beispiel, um zu demonstrieren, wie diese beiden Ausbreitungsstopps funktionieren.

Es sind drei Ereignishandler gebunden. Wenn wir die Weitergabe nicht stoppen, sollten vier Warnungen vorhanden sein - drei für die untergeordnete Div und eine für die übergeordnete Div.

Wenn wir verhindern, dass sich das Ereignis ausbreitet, gibt es 3 Warnungen (alle auf dem inneren untergeordneten Div). Da das Ereignis die DOM-Hierarchie nicht weitergibt, wird es vom übergeordneten div nicht angezeigt und der Handler wird nicht ausgelöst.

Wenn wir die Ausbreitung sofort stoppen, gibt es nur 1 Alarm. Obwohl dem inneren untergeordneten div drei Ereignishandler zugeordnet sind, wird nur 1 ausgeführt und jede weitere Weitergabe wird sofort beendet, selbst innerhalb desselben Elements.

Anurag
quelle
Beide stopPropagation()Varianten hören auch auf, sich in der DOM-Hierarchie weiterzugeben. Nicht nur auf. Bitte überprüfen Sie meine Antwort für Details mit der Erfassungsphase.
Robert Siemer
26

Aus der jQuery-API :

Diese Methode verhindert nicht nur, dass zusätzliche Handler für ein Element ausgeführt werden, sondern stoppt auch das Sprudeln, indem sie implizit event.stopPropagation () aufruft. Um einfach zu verhindern, dass das Ereignis zu Vorfahrenelementen sprudelt, aber anderen Ereignishandlern die Ausführung auf demselben Element ermöglicht, können wir stattdessen event.stopPropagation () verwenden.

Verwenden Sie event.isImmediatePropagationStopped (), um festzustellen, ob diese Methode jemals aufgerufen wurde (für dieses Ereignisobjekt).

Kurz gesagt: event.stopPropagation()Ermöglicht die Ausführung anderer Handler für dasselbe Element, während event.stopImmediatePropagation()verhindert wird , dass jedes Ereignis ausgeführt wird.

Aron Rotteveel
quelle
Nur um sicher zu gehen, event.stopImmediatePropagationhört die native Javascript-Version von nicht auf zu sprudeln, oder?
Alexander Derck
Wenn das Ereignis an die übergeordneten Elemente weitergegeben wird, wird die Weitergabe stopImmediatePropagationdes Ereignisses verhindert. Beide sollten das Sprudeln verhindern. Es ist nichts wert, dass Sie auch den Erfassungsmodus ändern können, der die äußersten Elemente zuerst und auslöst Erst dann gehen Sie zu den Kindern (Sprudeln ist die Standardeinstellung und funktioniert in die entgegengesetzte Richtung)
JonnySerra
1
Nicht genau, um es gelinde auszudrücken. Wenn Sie in der Erfassungsphase anhalten, können keine Bubble-Handler für dasselbe Element ausgeführt werden, wie in meiner Antwort erläutert.
Robert Siemer
23

event.stopPropagationverhindert, dass Handler für übergeordnete Elemente ausgeführt werden.
Durch das Aufrufen event.stopImmediatePropagationwird auch verhindert, dass andere Handler auf demselben Element ausgeführt werden.

SLaks
quelle
21
Erwähnenswert ist, dass Ereignishandler in der Reihenfolge ausgeführt werden, in der sie an das Element angehängt wurden.
Felix Kling
18

Ich bin ein Spätankömmling, aber vielleicht kann ich das anhand eines konkreten Beispiels sagen:

Sagen Sie, wenn Sie ein <table>, mit <tr>und dann haben <td>. Angenommen, Sie legen 3 Ereignishandler für das <td>Element fest. Wenn Sie dies event.stopPropagation()im ersten Ereignishandler tun, für den Sie festgelegt haben <td>, werden alle Ereignishandler für <td>weiterhin ausgeführt , aber das Ereignis wird einfach nicht an <tr>oder weitergegeben <table>(und wird es auch nicht) gehen und bis zu <body>, <html>, document, undwindow ).

Nun aber, wenn Sie verwenden event.stopImmediatePropagation()in Ihrem ersten Event - Handler, dann die beiden anderen Event - Handler für <td>nicht ausgeführt werden , und wird nicht propagieren bis zu <tr>, <table>(und wird nicht gehen und bis zu <body>, <html>, documentund window).

Beachten Sie, dass es nicht nur für ist <td>. Für andere Elemente folgt es dem gleichen Prinzip.

Unpolarität
quelle
10

1) event.stopPropagation(): => Es wird nur verwendet, um die Ausführung des entsprechenden übergeordneten Handlers zu stoppen.

2) event.stopImmediatePropagation(): => Es wird verwendet, um die Ausführung des entsprechenden übergeordneten Handlers sowie des Handlers oder der Funktion zu stoppen, die mit Ausnahme des aktuellen Handlers an sich selbst angehängt ist. => Es stoppt auch alle Handler, die an das aktuelle Element des gesamten DOM angehängt sind.

Hier ist das Beispiel: Jsfiddle !

Danke, -Sahil

Sahil Kashetwar
quelle
3

Mit event.stopPropagation () können andere Handler für dasselbe Element ausgeführt werden, während event.stopImmediatePropagation () verhindert, dass jedes Ereignis ausgeführt wird. Siehe zum Beispiel den folgenden jQuery-Codeblock.

$("p").click(function(event)
{ event.stopImmediatePropagation();
});
$("p").click(function(event)
{ // This function won't be executed 
$(this).css("color", "#fff7e3");
});

Wenn im vorherigen Beispiel event.stopPropagation verwendet wurde, wird das nächste Klickereignis auf das p-Element ausgelöst, das das CSS ändert. Falls event.stopImmediatePropagation () , wird das nächste p- Klickereignis nicht ausgelöst .

Rahul Kumar
quelle
2

Überraschenderweise sagen alle anderen Antworten nur die halbe Wahrheit oder sind tatsächlich falsch!

  • e.stopImmediatePropagation() verhindert, dass weitere Handler für dieses Ereignis aufgerufen werden, ohne Ausnahmen
  • e.stopPropagation()ist ähnlich, ruft aber immer noch alle Handler für diese Phase für dieses Element auf, wenn es nicht bereits aufgerufen wurde

Welche Phase?

ZB geht ein Klickereignis immer zuerst den gesamten Weg durch das DOM (als „Erfassungsphase“ bezeichnet), erreicht schließlich den Ursprung des Ereignisses („Zielphase“) und sprudelt dann wieder hoch („Blasenphase“). Und mitaddEventListener() Sie mehrere Handler unabhängig voneinander für die Erfassungs- und die Blasenphase registrieren. (Zielphase ruft Handler beider Typen auf dem Ziel auf, ohne zu unterscheiden.)

Und das ist es, worüber die anderen Antworten falsch sind:

  • Zitat: "event.stopPropagation () ermöglicht die Ausführung anderer Handler für dasselbe Element."
  • Korrektur: Wenn sie in der Erfassungsphase gestoppt werden, werden die Blasenphasen-Handler niemals erreicht und überspringen sie auch auf demselben Element
  • Zitat: "event.stopPropagation () [...] wird verwendet, um nur die Ausführung des entsprechenden übergeordneten Handlers zu stoppen."
  • Korrektur: Wenn in der Erfassungsphase gestoppt, werden auch die Handler aller Kinder, einschließlich des Ziels, nicht aufgerufen, nicht nur die Eltern

Eine Erklärung zur Ereignisphase von fiddle und mozilla.org mit Demo.

Robert Siemer
quelle
1

Hier füge ich mein JSfiddle-Beispiel für stopPropagation vs stopImmediatePropagation hinzu. JSFIDDLE

let stopProp = document.getElementById('stopPropagation');
let stopImmediate = document.getElementById('stopImmediatebtn');
let defaultbtn = document.getElementById("defalut-btn");


stopProp.addEventListener("click", function(event){
	event.stopPropagation();
  console.log('stopPropagation..')
  
})
stopProp.addEventListener("click", function(event){
  console.log('AnotherClick')
  
})
stopImmediate.addEventListener("click", function(event){
		event.stopImmediatePropagation();
    console.log('stopimmediate')
})

stopImmediate.addEventListener("click", function(event){
    console.log('ImmediateStop Another event wont work')
})

defaultbtn.addEventListener("click", function(event){
    alert("Default Clik");
})
defaultbtn.addEventListener("click", function(event){
    console.log("Second event defined will also work same time...")
})
div{
  margin: 10px;
}
<p>
The simple example for event.stopPropagation and stopImmediatePropagation?
Please open console to view the results and click both button.
</p>
<div >
<button id="stopPropagation">
stopPropagation-Button
</button>
</div>
<div  id="grand-div">
  <div class="new" id="parent-div">
    <button id="stopImmediatebtn">
    StopImmediate
    </button>
  </div>
</div>
<div>
<button id="defalut-btn">
Normat Button
</button>
</div>

Abhilash
quelle