stopPropagation
wird verhindert , dass alle Eltern von Handler ausgeführt wird stopImmediatePropagation
keine ü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!
$("p").click(function(event) {
// This function will now trigger
$(this).css("background-color", "#f00");
});
$("p").click(function(event) {
event.stopImmediatePropagation();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>example</p>
Ein kleines Beispiel, um zu demonstrieren, wie diese beiden Ausbreitungsstopps funktionieren.
Code-Snippet anzeigen
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.
quelle
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.Aus der jQuery-API :
Kurz gesagt:
event.stopPropagation()
Ermöglicht die Ausführung anderer Handler für dasselbe Element, währendevent.stopImmediatePropagation()
verhindert wird , dass jedes Ereignis ausgeführt wird.quelle
event.stopImmediatePropagation
hört die native Javascript-Version von nicht auf zu sprudeln, oder?stopImmediatePropagation
des 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)event.stopPropagation
verhindert, dass Handler für übergeordnete Elemente ausgeführt werden.Durch das Aufrufen
event.stopImmediatePropagation
wird auch verhindert, dass andere Handler auf demselben Element ausgeführt werden.quelle
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 diesevent.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>
,document
undwindow
).Beachten Sie, dass es nicht nur für ist
<td>
. Für andere Elemente folgt es dem gleichen Prinzip.quelle
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
quelle
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.
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 .
quelle
Ü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 Ausnahmene.stopPropagation()
ist ähnlich, ruft aber immer noch alle Handler für diese Phase für dieses Element auf, wenn es nicht bereits aufgerufen wurdeWelche 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 mit
addEventListener()
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:
Eine Erklärung zur Ereignisphase von fiddle und mozilla.org mit Demo.
quelle
Hier füge ich mein JSfiddle-Beispiel für stopPropagation vs stopImmediatePropagation hinzu. JSFIDDLE
quelle