67

Ich fragte mich, ob event.preventDefault() und return false die gleichen waren.event.preventDefault() vs. return false (keine jQuery)

Ich habe some tests getan, und es scheint, dass

  • Wenn der Event-Handler alte Modell hinzugefügt wird, zum Beispiel unter Verwendung

    elem.onclick = function(){ 
        return false; 
    }; 
    

    Dann return false Standardaktion verhindert, wie event.preventDefault().

  • Wenn die Event-Handler hinzugefügt wird addEventListener zum Beispiel unter Verwendung

    elem.addEventListener(
        'click', 
        function(e){ 
         return false; 
        }, 
        false 
    ); 
    

    Dann return false nicht daran hindert, die Standardaktion.

Verhalten sich alle Browser so?

Gibt es weitere Unterschiede zwischen event.preventDefault() und return false?

Wo finde ich einige Dokumentation (ich konnte nicht in MDN) über return false verhält sich wie event.preventDefault() in einigen Fällen?


Meine Frage ist nur über Normal Javascript, nicht jQuery, also bitte markieren Sie es nicht als Duplikat von event.preventDefault() vs. return false, auch wenn beide Fragen fast den gleichen Titel haben.

+0

Duplizieren von http://stackoverflow.com/questions/1357118/event-preventdefault-vs-return-false Wenn Sie die Frage lesen Sie feststellen, dass es ein allgemeines JS Problem ist nicht die jQuery-spezifischen . jQuery wurde nur verwendet, um den Beispielcode so kurz/sauber wie möglich zu machen. – RaYell

+9

@RaYell Nein, weil sich jQuerys 'return false' anders verhält als normale JavaScript's. Außerdem hat die andere Frage keine Antwort, die den Unterschied in einfachem JS erklärt (es gibt nur einen Kommentar, der es erklärt, aber schwer zu finden ist). Also denke ich, dass es besser ist, zwei verschiedene Fragen zu haben. – Oriol

Antwort

49

Die W3C Document Object Model Events Specification in 1.3.1. Veranstaltungsregistrierung Schnittstellen besagt, dass handleEvent im Eventlistener keinen Rückgabewert hat:

handleEvent Diese Methode wird aufgerufen, wenn ein Ereignis des Typs auftritt , für die die Eventlistener-Schnittstelle registriert wurde. [...] No Return Wert

unter 1.2.4. Ereignis Cancelation das Dokument auch fest, dass

Cancelation durch erreicht wird, das Ereignis des prevent Methode aufrufen. Wenn ein oder mehrere EventListener preventDefault während einer beliebigen Phase des Ereignisablaufs aufrufen, wird die Standardaktion abgebrochen.

, die Sie verwenden, keine Wirkung entmutigen sollen, dass die Rückkehr wahr/falsch in jedem Browser haben könnte und event.preventDefault() verwenden.

aktualisieren

Die HTML5-Spezifikation gibt tatsächlich wie ein Rückgabewert anders zu behandeln. Section 6.1.5.1 of the HTML Spec besagt, dass

Wenn Rückgabewert ist ein WebIDL boolean false Wert, dann brechen Sie den Ereignis.

für alles außer dem "mouseover" -Ereignis.

Fazit

ich noch event.preventDefault() in den meisten Projekten zu verwenden, würde empfehlen, da man mit der alten Spezifikation kompatibel sein wird und damit älterer Browser. Nur wenn Sie nur topaktuelle Browser unterstützen müssen, ist die Rückkehr von false zum Abbrechen in Ordnung.

+2

hinzugefügt wird Dieser Link wurde 2000 geschrieben. Die HTML5-Spezifikation: http://www.w3.org/TR/ html5/webappapis.html # event-handler-attributes sieht so aus, als handele es Rückgabewerte für viele Events (nicht mouseover): "Wenn der Rückgabewert ein falscher WebIDL Boolescher Wert ist, dann annulliere das Event" –

+0

Und von einigen schnellen Tests in Chrome, Beide geben false zurück und event.preventDefault() * unterbricht * die Propagierung nicht.Kredit hauptsächlich an @Oriol: Siehe [stop propagation] (http://jsfiddle.net/c9hxq8t8/) vs. [normal] (http://jsfiddle.net/8bwr2/) –

+0

thx, bearbeitete die Antwort –

-11

return false ist nur für IE, event.preventDefault() von Chrom unterstützt wird, ff ... modernen Browsern

+9

Aber auf Firefox 'return false' funktioniert wie' event.preventDefault() ', wenn der Event-Handler mit dem alten Modell – Oriol

1

Unterschied zwischen prevent, stopPropogation, return false

Table Showing Difference

Standardaktion - Server-Seite Aktion, wenn die Steuerung Ereignisse auslösen.

Angenommen, wir haben div Kontrolle und in ihm haben wir eine Taste. So div ist die Elternkontrolle des Buttons. Wir haben Client-Klick und Server-Side-Click-Ereignis der Schaltfläche. Wir haben auch click-side click event des div.

Auf Klick-Ereignis der Schaltfläche auf Client-Seite können wir die Aktionen der übergeordneten Steuerung und Server-seitigen Code mit folgenden drei Arten steuern:

  • return false - Diese erlauben nur Client-Side-Event der Steuerung. Das serverseitige Ereignis und das clientseitige Ereignis des übergeordneten Steuerelements werden nicht ausgelöst.

  • preventDefault() - Dies ermöglicht clientseitige Ereignis der Kontrolle und seiner übergeordneten Kontrolle. Serverseitiges Ereignis, dh. Die Standardaktion des Steuerelements wird nicht ausgelöst.

  • stopPropogation() - Dies ermöglicht clientseitige sowie serverseitige Ereignisse der Steuerung. Das clientseitige Ereignis des Controls ist nicht erlaubt.

+20

Sie liegen falsch , 'return false' stoppt die Propagierung nicht, daher wird die Elternkontrolle ausgelöst ([demo] (http://jsfiddle.net/8bwr2/)). Außerdem bin ich nicht sicher, was Sie mit "* Server Side Click Event *" meinen. – Oriol

+5

@Beginners, ignorieren Sie bitte diese Antwort. – pilau

+3

Was ist dieser Unsinn über serverseitige Ereignisse? -1 –