67

Zastanawiam się, czy event.preventDefault() i return false były takie same.event.preventDefault() vs return false (no jQuery)

Zrobiłem some tests i wydaje się, że

  • Jeśli procedura obsługi zdarzenia jest dodawany za pomocą starego modelu, na przykład

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

    Następnie return false zapobiega domyślną akcję, jak event.preventDefault().

  • Jeśli procedura obsługi zdarzenia jest dodawany za pomocą addEventListener np

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

    Następnie return false nie zapobiega domyślną akcję.

Czy wszystkie przeglądarki zachowują się w ten sposób?

Czy są więcej różnice między event.preventDefault() i return false?

Gdzie mogę znaleźć dokumentację (nie mogłem w MDN) o return false zachowuje się jak event.preventDefault() w niektórych przypadkach?


Moje pytanie jest tylko o zwykły JavaScript, nie jQuery, więc proszę nie oznaczyć go jako duplikat event.preventDefault() vs. return false, nawet jeśli oba pytania mają prawie taki sam tytuł.

+0

Duplikat http://stackoverflow.com/questions/1357118/event-preventdefault-vs-return-false Jeżeli odczytuje pan to pytanie można zauważyć, że jest to problem nie generic JS jQuery-specyficzny . jQuery był używany tylko do tego, aby przykładowy kod był możliwie jak najkrótszy/czysty. – RaYell

+9

@RaYell Nie, ponieważ 'return false' jQuery zachowuje się inaczej niż zwykły kod JavaScript. Co więcej, w drugim pytaniu nie ma odpowiedzi wyjaśniającej różnicę w zwykłym JS (jest tylko komentarz, który wyjaśnia to, ale jest trudny do znalezienia). Myślę więc, że lepiej jest mieć dwa różne pytania. – Oriol

Odpowiedz

49

W3C Document Object Model Events Specification w 1.3.1. Interfejsy rejestracji zdarzenia stwierdza, że ​​handleEvent w EventListener ma wartość zwracaną:

handleEvent Ta metoda jest wywoływana, gdy wystąpi zdarzenie typu dla których interfejs EventListener został zarejestrowany. [...] No Return Wartość

pod 1.2.4. Zdarzenie Anulowanie dokument stwierdza również, że

Anulowanie odbywa się poprzez wywołanie metody preventDefault imprezy. Jeśli co najmniej jeden EventListener wywoła preventDefault podczas dowolnej fazy przepływu zdarzeń, domyślna akcja zostanie anulowana.

które powinny zniechęcać do korzystania z żadnego wpływu, że powrót prawda/fałsz może mieć w każdej przeglądarce i używać event.preventDefault().

Aktualizacja

specyfikacji HTML5 faktycznie określa jak traktować zwracana wartość inna. Section 6.1.5.1 of the HTML Spec stwierdza, że ​​

Jeśli wartość zwracana jest wartość false WebIDL logiczna, a następnie anulować zdarzenie .

wszystko oprócz zdarzenia "mouseover".

Wnioski

I tak polecam użyć event.preventDefault() w większości projektów, ponieważ będzie kompatybilny ze starym ciemno, a więc starszych przeglądarek. Tylko jeśli potrzebujesz tylko obsługi najnowszych przeglądarek, zwracanie wartości false w celu anulowania jest w porządku.

+2

Ten link został napisany w 2000 roku. Specyfikacja HTML5: http://www.w3.org/TR/ html5/webappapis.html # event-handler-attributes wygląda tak, jakby obsługiwał wartości zwracane dla wielu zdarzeń (nie najechanie kursorem myszy): "Jeśli wartość zwracana jest wartością logiczną boolean WebIDL, anuluj zdarzenie" –

+0

A z szybkiego testowania w chrome, zarówno return false, jak i event.preventDefault() nie * nie * zatrzymują propagację.Kredyt głównie na @Oriol: Zobacz [zatrzymaj propagację] (http://jsfiddle.net/c9hxq8t8/) vs. [normalny] (http://jsfiddle.net/8bwr2/) –

+0

thx, zredagowałem odpowiedź –

-11

return false jest tylko dla IE, event.preventDefault() jest obsługiwany przez chrom, FF ... nowoczesnych przeglądarek

+9

Ale w Firefox 'return false' działa jak' event.preventDefault() ', gdy procedura obsługi zdarzenia jest dodana za pomocą starego modelu – Oriol

1

Różnica między preventDefault, stopPropogation, return false

Table Showing Difference

Domyślny Akcja - akcja stronie serwera, gdy kontrola podbicia wydarzenie.

Załóżmy, że mamy kontrolę div, a wewnątrz mamy przycisk. Więc div jest nadrzędną kontrolą przycisku. Mamy kliknięcie po stronie klienta i zdarzenie po kliknięciu przycisku po stronie serwera. Również mamy zdarzenie click po stronie klienta po stronie div.

dniu zdarzenia Click przycisku na stronie klienta, możemy kontrolować działania sterowania nadrzędnego i kodu po stronie serwera za pomocą trzech następujących sposobów:

  • return false - To pozwoli tylko klienta zdarzenie z boku kontrolą. Zdarzenie po stronie serwera i zdarzenie po stronie klienta kontrolki nadrzędnej nie jest uruchamiane.

  • preventDefault() - Umożliwia to zdarzenie po stronie klienta i kontrolę nad nim. Zdarzenie po stronie serwera, tj. Domyślna akcja sterowania nie jest uruchamiana.

  • stopPropogation() - To pozwala stronie klienta, jak również zdarzenia po stronie serwera kontroli. Zdarzenie po stronie klienta kontroli jest zabronione.

+20

Mylisz się , 'return false' nie zatrzymuje propagacji, więc kontrola rodzicielska jest odpalana ([demo] (http://jsfiddle.net/8bwr2/)). Co więcej, nie jestem pewien, co masz na myśli mówiąc "* zdarzenie po stronie serwera" *. – Oriol

+5

@Beginnerzy, zignoruj ​​tę odpowiedź. – pilau

+3

Co to za nonsens o zdarzeniach po stronie serwera? -1 –

Powiązane problemy