67

Tôi tự hỏi nếu event.preventDefault()return false là như nhau.event.preventDefault() so với trả về false (không có jQuery)

Tôi đã làm some tests, và có vẻ như rằng

  • Nếu xử lý sự kiện được thêm vào sử dụng mô hình cũ, ví dụ

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

    Sau đó, return false ngăn chặn hành động mặc định, như event.preventDefault().

  • Nếu xử lý sự kiện được thêm vào sử dụng addEventListener, ví dụ

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

    Sau đó, return false không ngăn cản hành động mặc định.

Mọi trình duyệt có hoạt động như thế này không?

Có sự khác biệt nào khác giữa event.preventDefault()return false không?

Tôi có thể tìm thấy một số tài liệu (Tôi không thể trong MDN) về return false hoạt động như event.preventDefault() trong một số trường hợp?


Câu hỏi của tôi là chỉ khoảng javascript đơn giản, không jQuery, vì vậy xin đừng đánh dấu nó như là một bản sao của event.preventDefault() vs. return false, thậm chí nếu cả hai câu hỏi có gần như cùng tên.

+0

Duplicate of http://stackoverflow.com/questions/1357118/event-preventdefault-vs-return-false Nếu bạn đọc câu hỏi, bạn sẽ nhận thấy rằng đó là vấn đề JS chung không phải là vấn đề cụ thể của jQuery . jQuery chỉ được sử dụng để làm cho mã ví dụ là ngắn/sạch càng tốt. – RaYell

+9

@RaYell Không, vì 'return false' của jQuery hoạt động khác với JavaScript thuần túy của jQuery. Hơn nữa, câu hỏi khác không có câu trả lời giải thích sự khác biệt trong JS đơn giản (chỉ có một bình luận giải thích nó, nhưng khó tìm). Vì vậy, tôi nghĩ rằng tốt hơn nên có hai câu hỏi khác nhau. – Oriol

Trả lời

49

Các W3C Document Object Model Events Specification trong 1.3.1. giao diện đăng ký tổ chức sự kiện khẳng định rằng handleEvent trong EventListener không có giá trị trả về:

handleEvent Phương pháp này được gọi là bất cứ khi nào một sự kiện xảy ra của các loại mà giao diện EventListener đã được đăng ký. [...] No Return Value

dưới 1.2.4. Tổ chức sự kiện Hủy tài liệu cũng nêu rõ rằng

Việc hủy bỏ được thực hiện bằng cách gọi phương thức ngăn chặn của sự kiện . Nếu một hoặc nhiều cuộc gọi EventListeners ngăn chặnDefault trong bất kỳ giai đoạn nào của luồng sự kiện , hành động mặc định sẽ bị hủy.

nên ngăn cản bạn sử dụng bất kỳ hiệu ứng nào trả về true/false có thể có trong bất kỳ trình duyệt nào và sử dụng event.preventDefault().

Cập nhật

HTML5 đặc tả thực sự xác định làm thế nào để đối xử với một giá trị trả về khác nhau. Section 6.1.5.1 of the HTML Spec khẳng định rằng

Nếu giá trị trả về là một WebIDL boolean giá trị false, thì hủy bỏ sự kiện .

cho mọi thứ trừ sự kiện "di chuột qua".

Kết luận

tôi vẫn muốn giới thiệu để sử dụng event.preventDefault() trong hầu hết các dự án kể từ khi bạn sẽ tương thích với spec cũ và các trình duyệt như vậy cũ. Chỉ khi bạn chỉ cần hỗ trợ các trình duyệt cắt cạnh, trả về false để hủy là được.

+2

Liên kết này được viết vào năm 2000. Thông số HTML5: http://www.w3.org/TR/ html5/webappapis.html # event-handler-attributes trông giống như nó xử lý các giá trị trả lại cho nhiều sự kiện (không di chuột qua): "Nếu giá trị trả về là giá trị false boolean WebIDL, thì hãy hủy sự kiện" –

+0

Và từ một số thử nghiệm nhanh trong chrome, cả hai trả về false và event.preventDefault() làm * not * stop propagation.Tín dụng chủ yếu là @Oriol: Xem [ngừng tuyên truyền] (http://jsfiddle.net/c9hxq8t8/) so với [bình thường] (http://jsfiddle.net/8bwr2/) –

+0

thx, đã chỉnh sửa câu trả lời –

-11

return false chỉ dành cho IE, event.preventDefault() được hỗ trợ bởi chrome, ff ... trình duyệt hiện đại

+9

Nhưng trên Firefox 'return false' hoạt động như' event.preventDefault() 'khi trình xử lý sự kiện được thêm vào bằng cách sử dụng mô hình cũ – Oriol

1

Sự khác nhau giữa preventDefault, stopPropogation, trả về false

Table Showing Difference

Mặc định Action - hành động phía máy chủ khi sự kiện kiểm soát tăng.

Giả sử chúng ta có điều khiển div và bên trong nó, chúng ta có một nút. Vì vậy, div là kiểm soát cha mẹ của nút. Chúng tôi có Nhấp chuột phía máy khách và sự kiện nhấp chuột bên máy chủ của nút. Ngoài ra chúng tôi có sự kiện nhấp chuột phía khách hàng của div.

Khi được nhấp sự kiện của nút về phía khách hàng, chúng tôi có thể kiểm soát các hành động của phụ huynh kiểm soát và mã phía máy chủ sử dụng sau ba cách:

  • return false - Đây chỉ cho phép khách hàng sự kiện bên lề của sự kiểm soát. Sự kiện phía máy chủ và sự kiện phía máy khách của điều khiển chính không được kích hoạt.

  • preventDefault() - Điều này cho phép sự kiện bên phía khách hàng kiểm soát và kiểm soát của phụ huynh. Server sự kiện bên tức là. Hành động mặc định của điều khiển không được kích hoạt.

  • stopPropogation() - Điều này cho phép phía máy khách cũng như sự kiện phía máy chủ của điều khiển. Sự kiện phía khách hàng của điều khiển không được phép.

+20

Bạn sai , 'return false' không dừng truyền, vì vậy điều khiển cha mẹ được kích hoạt ([demo] (http://jsfiddle.net/8bwr2/)). Hơn nữa, tôi không chắc chắn những gì bạn có nghĩa là với "* phía máy chủ bấm vào sự kiện *". – Oriol

+5

@Beginners, vui lòng bỏ qua câu trả lời này. – pilau

+3

Điều gì là vô nghĩa về các sự kiện phụ của máy chủ? -1 –