Wenn ich verhindern möchte, dass andere Ereignishandler ausgeführt werden, nachdem ein bestimmtes Ereignis ausgelöst wurde, kann ich eine von zwei Techniken verwenden. Ich werde jQuery in den Beispielen verwenden, aber dies gilt auch für Plain-JS:
1. event.preventDefault()
$('a').click(function (e) {
// custom handling here
e.preventDefault();
});
2. return false
$('a').click(function () {
// custom handling here
return false;
});
Gibt es einen signifikanten Unterschied zwischen diesen beiden Methoden zum Stoppen der Ereignisausbreitung?
Für mich return false;
ist es einfacher, kürzer und wahrscheinlich weniger fehleranfällig als das Ausführen einer Methode. Bei der Methode müssen Sie sich an das richtige Gehäuse, die richtige Klammer usw. erinnern.
Außerdem muss ich den ersten Parameter im Rückruf definieren, um die Methode aufrufen zu können. Vielleicht gibt es einige Gründe, warum ich es vermeiden sollte, es so zu machen und preventDefault
stattdessen zu verwenden? Was ist der bessere Weg?
preventDefault
ist nicht andere handers verhindert die Ausführung. DafürstopImmediatePropagation
ist es da.Antworten:
return false
von innerhalb eines Event - Handler jQuery ist das Gleiche wie beide forderne.preventDefault
unde.stopPropagation
auf dem übergebenen jQuery.Event Objekt.e.preventDefault()
verhindert das Auftreten des Standardereignisses,e.stopPropagation()
verhindert das Sprudeln des Ereignisses undreturn false
bewirkt beides. Beachten Sie, dass dieses Verhalten unterscheidet sich von normalen (nicht-jQuery) Event - Handler, in denen vor allem,return false
hat nicht das Ereignis aus sprudeln zu stoppen.Quelle: John Resig
Gibt es einen Vorteil bei der Verwendung von event.preventDefault () gegenüber "return false", um einen href-Klick abzubrechen?
quelle
return false
von einem DOM2-Handler (addEventListener
) tut überhaupt nichts (verhindert weder den Standard noch stoppt das Sprudeln; von einem Microsoft DOM2-ish-Handler (attachEvent
) verhindert er den Standard, sprudelt aber nicht; von einem DOM0-Handler (onclick="return ..."
) verhindert er den Standard (bereitgestellt) Sie fügen dasreturn
in das Attribut ein), aber es sprudelt nicht. Von einem jQuery-Ereignishandler aus wird beides ausgeführt, da dies eine jQuery-Sache ist. Details und Live-Tests hierreturn false
die Ereignisausbreitung in Nicht-jQuery-Ereignishandlern nicht gestoppt wird. dh<a href="#" onclick="return false">Test</a>
nicht nicht aufhören das Ereignis aus sprudeln.Nach meiner Erfahrung gibt es bei der Verwendung von event.preventDefault () mindestens einen klaren Vorteil gegenüber der Verwendung von return false. Angenommen, Sie erfassen das Klickereignis auf einem Ankertag. Andernfalls wäre es ein großes Problem, wenn der Benutzer von der aktuellen Seite weg navigiert würde. Wenn Ihr Klick-Handler return false verwendet, um die Browsernavigation zu verhindern, besteht die Möglichkeit, dass der Interpreter die return-Anweisung nicht erreicht und der Browser das Standardverhalten des Ankertags ausführt.
Der Vorteil der Verwendung von event.preventDefault () besteht darin, dass Sie dies als erste Zeile im Handler hinzufügen können, um sicherzustellen, dass das Standardverhalten des Ankers nicht ausgelöst wird, unabhängig davon, ob die letzte Zeile der Funktion nicht erreicht wird (z. B. Laufzeitfehler) ).
quelle
Dies ist keine "JavaScript" -Frage, wie Sie es betitelt haben. Es ist eine Frage zum Design von jQuery.
jQuery und das zuvor verknüpfte Zitat von John Resig (in karim79s Nachricht ) scheinen das Grundmissverständnis darüber zu sein, wie Event-Handler im Allgemeinen funktionieren.
Fakt: Ein Ereignishandler, der false zurückgibt, verhindert die Standardaktion für dieses Ereignis. Die Ereignisausbreitung wird nicht gestoppt. Event-Handler haben seit den alten Tagen von Netscape Navigator immer so funktioniert.
In der Dokumentation von MDN wird erläutert, wie
return false
in einem Ereignishandler funktioniertWas in jQuery passiert, ist nicht dasselbe wie das, was mit Ereignishandlern passiert. DOM-Ereignis-Listener und "angehängte" MSIE-Ereignisse sind eine ganz andere Sache.
Weitere Informationen finden Sie in attachEvent auf MSDN und in der Dokumentation zu W3C DOM 2-Ereignissen .
quelle
return false
die gleiche Interpretation wieevent.preventDefault()
. Aber ich weiß nicht; Es reicht aus, wenn ich das mit einer Prise Salz nehme.jQuery
ist lediglich eine Teilmenge von JavaScript, nicht eine eigene Sprache.Im Allgemeinen ist Ihre erste Option (
preventDefault()
) diejenige, die Sie wählen müssen, aber Sie müssen wissen, in welchem Kontext Sie sich befinden und welche Ziele Sie verfolgen.Kraftstoff Ihre Codierung hat einen großen Artikel über
return false;
vsevent.preventDefault()
vsevent.stopPropagation()
vsevent.stopImmediatePropagation()
.quelle
Wenn Sie jQuery verwenden, werden
return false
beim Aufrufen drei verschiedene Dinge ausgeführt:event.preventDefault();
event.stopPropagation();
Weitere Informationen und Beispiele finden Sie unter jQuery-Ereignisse: Stop (Mis) Using Return False .
quelle
Sie können viele Funktionen
onClick
für ein Element an das Ereignis hängen . Wie können Sie sicher sein, dassfalse
derjenige der letzte ist, der feuert?preventDefault
Auf der anderen Seite wird definitiv nur das Standardverhalten des Elements verhindert.quelle
Ich glaube
event.preventDefault()
ist die von w3c angegebene Methode zum Abbrechen von Ereignissen.
Sie können dies in der W3C-Spezifikation zur Ereignisabbruch lesen .
Außerdem können Sie return false nicht in jeder Situation verwenden. Wenn Sie im href-Attribut eine Javascript-Funktion angeben und false zurückgeben, wird der Benutzer auf eine Seite mit falsch geschriebener Zeichenfolge umgeleitet.
quelle
<a href="javascript:return false"
oder so?Ich denke, der beste Weg, dies zu tun, ist die Verwendung,
event.preventDefault()
denn wenn im Handler eine Ausnahme ausgelöst wird, dann die Rückgabefalse
Anweisung übersprungen und das Verhalten ist entgegengesetzt zu dem, was Sie wollen.Wenn Sie jedoch sicher sind, dass der Code keine Ausnahmen auslöst, können Sie eine beliebige Methode verwenden.
Wenn Sie dennoch mit der Rückgabe fortfahren möchten,
false
können Sie Ihren gesamten Handler-Code wie folgt in einen Try-Catch-Block einfügen:quelle
Meine Meinung aus meiner Erfahrung sagt, dass es immer besser ist, zu verwenden
Praktisch, um das Senden eines Ereignisses zu stoppen oder zu verhindern, wann immer wir es benötigen, anstatt dass es gut
return false
event.preventDefault()
funktioniert.quelle
preventDefault
ist ein paar englische Wörter, die ich verstehe "verhindert die Standardeinstellung".return false
ist ein paar englische Wörter, die ich verstehe "gibt falsch zurück", aber ich habe keine Ahnung warum, bis ich diesen kryptischen Code google. Und Bonus kann ich separat steuernstopPropagation
undpreventDefault
.Der Hauptunterschied zwischen
return false
undevent.preventDefault()
besteht darin, dass Ihr Code untenreturn false
nicht ausgeführt wird und inevent.preventDefault()
falls Ihr Code nach dieser Anweisung ausgeführt wird.Wenn Sie return false schreiben, erledigen Sie hinter den Kulissen die folgenden Dinge für Sie.
quelle
e.preventDefault ();
Es stoppt einfach die Standardaktion eines Elements.
Verhindert, dass der Hyperlink der URL folgt, und verhindert, dass die Schaltfläche "Senden" das Formular sendet. Wenn Sie viele Ereignishandler haben und nur verhindern möchten, dass Standardereignisse und viele Male auftreten, müssen wir dies oben in der Funktion () verwenden.
Der Grund für die Verwendung
e.preventDefault();
ist, dass in unserem Code, damit im Code etwas schief geht, der Link oder das Formular ausgeführt werden kann, um gesendet zu werden, oder dass Sie die erforderlichen Aktionen ausführen oder zulassen können. Die Schaltfläche & Link oder Senden wird gesendet und ermöglicht weiterhin die Weitergabe des Ereignisses.falsch zurückgeben;
Es stoppt einfach die Ausführung der Funktion ().
"
return false;
" beendet die gesamte Ausführung des Prozesses.Der Grund für die Verwendung von return false; ist, dass Sie die Funktion nicht mehr im strengen Modus ausführen möchten.
quelle
Grundsätzlich kombinieren Sie auf diese Weise Dinge, da jQuery ein Framework ist, das sich hauptsächlich auf HTML-Elemente konzentriert. Sie verhindern im Grunde die Standardeinstellung, stoppen aber gleichzeitig die Weitergabe, um zu sprudeln.
Wir können also einfach sagen, dass die Rückgabe von false in
jQuery
gleich ist:return false ist e.preventDefault UND e.stopPropagation
Vergessen Sie aber auch nicht, dass alles in jQuery- oder DOM-bezogenen Funktionen enthalten ist. Wenn Sie es für das Element ausführen, wird im Grunde verhindert, dass alles ausgelöst wird, einschließlich des Standardverhaltens und der Weitergabe des Ereignisses.
Grundsätzlich sollten Sie vor Beginn der Verwendung
return false;
zunächst verstehen, wase.preventDefault();
unde.stopPropagation();
tun. Wenn Sie der Meinung sind, dass Sie beide gleichzeitig benötigen, verwenden Sie sie einfach.Also im Grunde dieser Code unten:
ist gleich diesem Code:
quelle
Nach meiner Erfahrung wird event.stopPropagation () hauptsächlich in CSS-Effekten oder Animationsarbeiten verwendet, z. B. wenn Sie einen Hover-Effekt sowohl für die Karte als auch für das Schaltflächenelement haben. Wenn Sie mit der Maus über die Schaltfläche fahren, werden in diesem Fall sowohl der Karten- als auch der Schaltflächen-Hover-Effekt ausgelöst Sie können event.stopPropagation () verwenden, um das Sprudeln von Aktionen zu stoppen, und event.preventDefault () dient dazu, das Standardverhalten von Browseraktionen zu verhindern. Sie haben beispielsweise ein Formular, aber Sie haben nur ein Klickereignis für die Übermittlungsaktion definiert. Wenn der Benutzer das Formular durch Drücken der Eingabetaste sendet, den durch das Tastendruckereignis ausgelösten Browser und nicht Ihr Klickereignis hier, sollten Sie event.preventDefault () verwenden, um Unangemessenheit zu vermeiden Verhalten. Ich weiß nicht, was zum Teufel falsch zurückkommt; Für weitere Erläuterungen besuchen Sie diesen Link und spielen Sie mit Zeile 33https://www.codecademy.com/courses/introduction-to-javascript/lessons/requests-i/exercises/xhr-get-request-iv
quelle