Ich fragte mich, ob event.preventDefault()
und ob return false
es dasselbe war.
Ich habe einige Tests durchgeführt , und es scheint, dass
Wenn der Ereignishandler beispielsweise mit einem alten Modell hinzugefügt wird
elem.onclick = function(){ return false; };
Dann
return false
verhindert Standardaktion, wieevent.preventDefault()
.Wenn der Ereignishandler beispielsweise mit hinzugefügt
addEventListener
wirdelem.addEventListener( 'click', function(e){ return false; }, false );
return false
Verhindert dann nicht die Standardaktion.
Verhalten sich alle Browser so?
Gibt es weitere Unterschiede zwischen event.preventDefault()
und return false
?
Wo finde ich eine Dokumentation (ich konnte nicht in MDN) über das return false
Verhalten event.preventDefault()
in einigen Fällen?
Meine Frage bezieht sich nur auf einfaches Javascript, nicht auf jQuery. Bitte markieren Sie es nicht als Duplikat von event.preventDefault () vs. return false , auch wenn beide Fragen fast den gleichen Titel haben.
return false
anders verhält als das von einfachem JavaScript. Darüber hinaus hat die andere Frage keine Antwort, die den Unterschied in einfachem JS erklärt (es gibt nur einen Kommentar, der dies erklärt, aber schwer zu finden ist). Ich denke, es ist besser, zwei verschiedene Fragen zu haben.Antworten:
Die W3C-Dokumentobjektmodell-Ereignisspezifikation in 1.3.1. Ereignisregistrierungsschnittstellen geben an , dass
handleEvent
im EventListener kein Rückgabewert vorhanden ist:unter 1.2.4. Ereignisabbruch Das Dokument gibt auch an, dass
Dies sollte Sie davon abhalten, Effekte zu verwenden, die die Rückgabe von true / false in jedem Browser und in jeder Verwendung haben könnte
event.preventDefault()
.Aktualisieren
Die HTML5-Spezifikation gibt tatsächlich an, wie ein Rückgabewert anders behandelt werden soll. In Abschnitt 7.1.5.1 der HTML-Spezifikation heißt es:
für alles außer dem "mouseover" -Ereignis.
Fazit
Ich würde weiterhin empfehlen,
event.preventDefault()
in den meisten Projekten zu verwenden, da Sie mit der alten Spezifikation und damit älteren Browsern kompatibel sind. Nur wenn Sie nur hochmoderne Browser unterstützen müssen, ist die Rückgabe von false zum Abbrechen in Ordnung.quelle
stopPropagation()
,preventDefault()
undreturn false
: jsfiddle.net/m1L6of9x . In modernen Browsern haben die beiden letzteren das gleiche Verhalten.Hier sind einige Beispiele, die Menschen helfen könnten, ihre Probleme besser zu verstehen und zu beheben.
TL; DR
on*
Ereignishandler (z. B.onclick
Attribut für ein Schaltflächenelement): Geben Sie false zurück, um das Ereignis abzubrechenaddEventListener
ist eine andere API, Rückgabewerte (zBfalse
) werden ignoriert: useevent.preventDefault()
.onclick="<somejs>"
hat seine eigene potenzielle Verwirrung, weil<somejs>
es in den Körper einer Onclick-Funktion eingewickelt ist.getEventListeners
API des Browsers, um zu sehen, wie Ihr Ereignis-Listener zur Fehlerbehebung aussieht, wenn sich Ihr Ereignishandler nicht wie erwartet verhält.Beispiel
Dieses Beispiel ist spezifisch für das
click
Ereignis mit einem<a>
Link ... kann jedoch für die meisten Ereignistypen verallgemeinert werden.Wir haben einen Anker (Link) mit einer Klasse
js-some-link-hook
, mit der wir ein Modal öffnen und verhindern möchten, dass eine Seitennavigation stattfindet.Die folgenden Beispiele wurden in Google Chrome (71) unter MacOS Mojave ausgeführt.
Eine große Gefahr besteht darin, anzunehmen, dass dies
onclick=functionName
das gleiche Verhalten wie bei der Verwendung istaddEventListener
onclick-Attribut
Führen Sie dann in der Browser-Devtools-Konsole Folgendes aus:
... und du siehst:
Das funktioniert überhaupt nicht. Bei Verwendung
onclick=
Ihres Handlers wird die Funktion in eine andere Funktion eingeschlossen. In diesem Fall können Sie sehen, dass meine Funktionsdefinition enthalten ist, aber nicht aufgerufen wird, da ich die Funktionsreferenz angegeben habe, ohne sie aufzurufen. Außerdem können Sie sehen, dass selbst wenn meine Funktion aufgerufen wurde und meine Funktion false zurückgab ... die onclick-Funktion diesen falschen Wert nicht zurückgeben würde ... der erforderlich ist, um das Ereignis abzubrechen. Wir müssen wirklichreturn myHandlerFunc();
in die Onclick-Funktion eingebunden sein, damit die Dinge funktionieren.Jetzt, da wir sehen, wie das funktioniert, können wir den Code ändern, um zu tun, was wir wollen. Seltsames Beispiel zur Veranschaulichung (verwenden Sie diesen Code nicht):
Sie sehen, wir haben unsere eventHandler-Funktionsdefinition in einen String eingeschlossen. Insbesondere: eine selbstausführende Funktion mit einer return-Anweisung an der Vorderseite.
Wieder in der Chrome Devtools-Konsole:
...zeigt an:
... also ja, das sollte funktionieren. Unser
return false
(!1
aufgrund minification läuft, sorry). Sicher genug, wenn wir auf den Link klicken, erhalten wir die Warnung und wenn wir die Warnung schließen, navigiert die Seite nirgendwo hin oder wird aktualisiert.addEventListener
Browser-Devtools:
Ergebnis:
So können Sie den Unterschied bereits erkennen. Wir sind nicht in eine Onclick-Funktion eingebunden. Unsere
return false
(return !1
aufgrund von Minimierung) ist hier also auf der obersten Ebene und wir müssen uns nicht darum kümmern, wie zuvor eine zusätzliche Rückgabeanweisung hinzuzufügen.Es sieht also so aus, als ob es funktionieren sollte. Wenn Sie auf den Link klicken, erhalten Sie eine Benachrichtigung. Schließen Sie die Warnung und die Seite navigiert / aktualisiert. dh das Ereignis wurde NICHT durch Rückgabe von false abgebrochen.
Wenn wir die Spezifikation nachschlagen (siehe Ressourcen unten), sehen wir, dass unsere Rückruf- / Handlerfunktion für addEventListener keinen Rückgabetyp unterstützt. Wir können zurückgeben, was wir wollen, aber da es nicht Teil der Benutzeroberfläche ist, hat es keine Auswirkungen.
Lösung: Verwenden
event.preventDefault()
stattreturn false;
...Browser Devtools ...
gibt ...
...wie erwartet.
Testen: Alarm erhalten. Alarm abweisen. Keine Seitennavigation oder Aktualisierung ... was wir wollen.
Ressourcen
Die HTML5-Spezifikation ( https://www.w3.org/TR/html5/webappapis.html#events ) verwirrt die Dinge, weil sie beide
onclick
undaddEventListener
in ihren Beispielen verwenden und Folgendes sagen:So scheint es zu bedeuten , dass
return false
das Ereignis für beide storniertaddEventListener
undonclick
.Wenn Sie sich jedoch die verknüpfte Definition ansehen, sehen
event-handler
Sie:https://www.w3.org/TR/html5/webappapis.html#event-handler
Es scheint also, dass das
return false
Abbrechen des Ereignisses nur für dieonclick
(oder allgemeinon*
) Ereignishandler gilt und nicht für registrierte Ereignishandler, überaddEventListener
die eine andere API verfügt. Da die addEventListener-API nicht unter die HTML5-Spezifikation und nur dieon*
Ereignishandler fällt , wäre es weniger verwirrend, wenn sie sich in ihren Beispielen daran halten und den Unterschied ausdrücklich herausstellen würden.quelle
Unterschied zwischen präventDefault, stopPropogation, return false
Standardaktion - Serverseitige Aktion beim Auslösen eines Steuerereignisses.
Angenommen, wir haben Div-Kontrolle und darin haben wir einen Knopf. Div ist also die übergeordnete Steuerung der Schaltfläche. Wir haben Client-Side-Click- und Server-Side-Click-Ereignis der Schaltfläche. Wir haben auch ein clientseitiges Klickereignis des Div.
Beim Klickereignis der Schaltfläche auf der Clientseite können wir die Aktionen der übergeordneten Steuerung und des serverseitigen Codes auf drei Arten steuern:
return false
- Dies erlaubt nur clientseitige Ereignisse des Steuerelements. Das serverseitige Ereignis und das clientseitige Ereignis des übergeordneten Steuerelements werden nicht ausgelöst.preventDefault()
- Dies ermöglicht clientseitige Steuerungsereignisse und deren übergeordnete Steuerung. Serverseitiges Ereignis, dh. Die Standardaktion des Steuerelements wird nicht ausgelöst.stopPropogation()
- Dies ermöglicht sowohl clientseitige als auch serverseitige Ereignisse des Steuerelements. Das clientseitige Ereignis des Steuerelements ist nicht zulässig.quelle
return false
stoppen die Weitergabe nicht, sodass die übergeordnete Steuerung ausgelöst wird ( Demo ). Außerdem bin ich mir nicht sicher, was Sie mit " serverseitigem Klickereignis " meinen .return false
ist nur für IE,event.preventDefault()
wird von Chrome unterstützt, ff ... moderne Browserquelle
return false
funktioniert es so,event.preventDefault()
als würde der Event-Handler mit dem alten Modell hinzugefügt