web-dev-qa-db-de.com

jquery: event.stopImmediatePropagation () vs return false

Gibt es einen Unterschied zwischen dem Aufruf von event.stopImmediatePropagation() und return false innerhalb eines Event-Handlers?

55
Arjun

Ja, sie sind unterschiedlich.

return false ist im Grunde dasselbe wie das Aufrufen von beiden, event.stopPropagation() und event.preventDefault() .

Während event.stopImmediatePropagation() dasselbe ist wie event.stopPropagation() plus , das andere registrierte Event-Handler verhindert auf dem gleichen Element ausgeführt werden. Daher wird die Standardaktion für ein Ereignis, z. B. das Folgen eines angeklickten Links, nicht verhindert.

Zusamenfassend:

                            stop   |    prevent     | prevent "same element"
                          bubbling | default action | event handlers

return false                 Yes           Yes             No
preventDefault               No            Yes             No
stopPropagation              Yes           No              No
stopImmediatePropagation     Yes           No              Yes

return false funktioniert auch in "normalen" JavaScript-Ereignishandlern

event.stopPropagation() und event.preventDefault() funktionieren auch in "normalen" JavaScript-Ereignishandlern (in einem W3C-kompatiblen Browser), während event.stopImmediatePropagation() eine Erweiterung von jQuery ist ( update: anscheinend ist Teil der DOM Level 3 Events Spezifikation ).

Hinweis: return false verhindert nicht , dass das Ereignis sprudelt in "normalen" (nicht jQuery) Ereignishandlern (siehe diese Antwort ) (verhindert aber immer noch die Standardaktion) .


Vielleicht lesenswert:

145
Felix Kling

Die Rückgabe von false stoppt das Blubbern der Ereignisse, aber andere gebundene Ereignisse werden ausgelöst. stopImmediatePropagation verhindert jedoch, dass andere gebundene Ereignisse ausgelöst werden, und stoppt das Blasen.

Code Beispiel dafür auf jsfiddle .

4
Mark Coleman

Hier ist die vollständige Demo für return false, preventDefault, stopPropagation und stopImmediatePropagation:

var kid = document.getElementsByTagName('button')[0];
var dad = document.getElementsByTagName('div')[0];

kid.addEventListener('click', function(e) {
    console.log('kid here');
    e.stopImmediatePropagation();
});

kid.addEventListener('click', function(e) {
    console.log('neighbour kid here');
});

dad.addEventListener('click', function(e) {
   console.log('dad here');
});

dad.addEventListener('click', function(e) {
   console.log('neighbour dad here');
});
<div>
    <button>press</button>
</div>

(Auch verfügbar auf JSFiddle .)

Die Tabelle in manwals Antwort ist nicht vollständig korrekt.

                            stop   |    prevent     |       prevent
                          bubbling | default action |    event handlers
                                   |                |  Same Element  |  Parent Element

return false                 Yes           Yes               No           No
preventDefault               No            Yes               No           No
stopPropagation              Yes           No                No           Yes
stopImmediatePropagation     Yes           No                Yes          **Yes**
1
kshirish

@FelixKling-Antworttabelle mit tollem Konzept:

Ich poste mehr erläuterte Tabelle:

                            stop   |    prevent     |       prevent          |
                          bubbling | default action |    event handlers      |
                                                     Same Element  |  Parent Element

return false                 Yes           Yes             No           No
preventDefault               No            Yes             No           No
stopPropagation              Yes           No              No           Yes
stopImmediatePropagation     Yes           No              Yes          No

Referenz: https://stackoverflow.com/a/5302939/2236219

0
Manwal

Ja. Mit event.stopImmediatePropagation () können keine anderen Handler für dieses Ereignis aufgerufen werden, unabhängig davon, wo sie gebunden sind. Die Rückgabe false gibt nur an, dass an andere Elemente gebundene Handler (dh nicht das gleiche Element wie der Ereignishandler, der den Aufruf stopImmediatePropagation () ausführt) das Ereignis empfangen.

0
gailbear