jQuery tương đương với phương thức addEventListener của JavaScript


190

Tôi đang cố gắng tìm jQuery tương đương với lệnh gọi phương thức JavaScript này:

document.addEventListener('click', select_element, true);

Tôi đã đi xa như:

$(document).click(select_element);

nhưng điều đó không đạt được kết quả tương tự, như tham số cuối cùng của phương thức JavaScript - một boolean cho biết liệu trình xử lý sự kiện sẽ được thực thi trong giai đoạn bắt hoặc tạo bọt (theo cách hiểu của tôi từ http://www.quirksmode.org /js/events_advified.html ) - bị bỏ lại.

Làm cách nào để chỉ định tham số đó hoặc nếu không đạt được cùng chức năng, sử dụng jQuery?


3
Ghi sự kiện không được jQuery hỗ trợ, vì chụp sự kiện không được IE hỗ trợ, jQuery nào hỗ trợ;) Bạn đang tìm kiếm khả năng tương thích IE?
Lưỡi liềm tươi

Cảm ơn, Crescent Fresh - Tôi nghĩ rằng điều đó có ý nghĩa ngay bây giờ. Tôi cần khả năng tương thích IE vì vậy tôi cho rằng tôi cần quên đi giai đoạn chụp.
Bungle

Câu trả lời:


142

Không phải tất cả các trình duyệt đều hỗ trợ ghi sự kiện (ví dụ: các phiên bản Internet Explorer dưới 9 không) nhưng tất cả đều hỗ trợ sự kiện sủi bọt, đó là lý do tại sao đó là giai đoạn được sử dụng để liên kết các trình xử lý với các sự kiện trong tất cả các tóm tắt trình duyệt chéo, bao gồm cả jQuery.

Phương pháp gần nhất với những gì bạn đang tìm kiếm trong jQuery đang sử dụng bind()(được thay thế bởi on()jQuery 1.7+) hoặc các phương thức jQuery dành riêng cho sự kiện (trong trường hợp này, dù sao cũng click()gọi bind()nội bộ). Tất cả sử dụng giai đoạn sủi bọt của một sự kiện lớn lên.


6
Có vẻ như IE9 cuối cùng cũng hỗ trợ nó. blog.msdn.com/b/ie/archive/2010/03/26/ Mạnh
một số

và tại sao họ không hỗ trợ chụp sự kiện? nhược điểm của việc chụp sự kiện là gì?
Aakash

2
Nói rõ hơn, bạn đang nói rằng những gì OP muốn là không thể - rằng bạn phải sử dụng bong bóng và không thể sử dụng chức năng chụp. Đúng?
Noumenon

115

Kể từ jQuery 1.7, .on()giờ đây là phương thức ưa thích của các sự kiện ràng buộc, thay vì .bind():

Từ http://api.jquery.com/bind/ :

Kể từ jQuery 1.7, phương thức .on () là phương thức ưa thích để đính kèm các trình xử lý sự kiện vào tài liệu. Đối với các phiên bản trước, phương thức .bind () được sử dụng để đính kèm một trình xử lý sự kiện trực tiếp vào các phần tử. Trình xử lý được gắn vào các phần tử hiện được chọn trong đối tượng jQuery, vì vậy các phần tử đó phải tồn tại tại thời điểm xảy ra lệnh gọi đến .bind (). Để liên kết sự kiện linh hoạt hơn, hãy xem thảo luận về ủy nhiệm sự kiện trong .on () hoặc .delegate ().

Trang tài liệu được đặt tại http://api.jquery.com/on/


Câu trả lời được chấp nhận đã được chỉnh sửa để giải quyết điều này.
Người dùng không phải là người dùng


14

Một điều cần lưu ý là các phương thức sự kiện jQuery không kích hoạt / bẫy loadtrên embedcác thẻ có chứa SVG DOM mà tải dưới dạng một tài liệu riêng biệt trong embedthẻ. Cách duy nhất tôi tìm thấy để bẫy một loadsự kiện trên đó là sử dụng JavaScript thô.

Điều này sẽ không hoạt động (Tôi đã thử on/ bind/ loadphương thức):

$img.on('load', function () {
    console.log('FOO!');
});

Tuy nhiên, điều này hoạt động:

$img[0].addEventListener('load', function () {
    console.log('FOO!');
}, false);

1
cần lưu ý đây là cách chính xác nếu bạn dự định không ghi đè bất kỳ trình xử lý sự kiện ràng buộc nào khác cho (các) phần tử.
r3wt

là gì $img?
anatol

12

Bây giờ bạn nên sử dụng .on()chức năng để liên kết các sự kiện.


2

$( "button" ).on( "click", function(event) {

    alert( $( this ).html() );
    console.log( event.target );

} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<button>test 1</button>
<button>test 2</button>


1

Đây là một cách xử lý tuyệt vời trên Mạng phát triển Mozilla (MDN) về vấn đề này đối với JavaScript tiêu chuẩn (nếu bạn không muốn dựa vào jQuery hoặc hiểu rõ hơn về nó nói chung):

https://developer.mozilla.org/en-US/docs/DOM/element.addEventListener

Đây là một cuộc thảo luận về dòng sự kiện từ một liên kết trong điều trị trên:

http://www.w3.org/TR/DOM-Level-3-Events/#event-flow

Một số điểm chính là:

  • Nó cho phép thêm nhiều hơn một trình xử lý cho một sự kiện
  • Nó cho phép bạn kiểm soát tốt hơn giai đoạn khi người nghe được kích hoạt (chụp so với sủi bọt)
  • Nó hoạt động trên mọi phần tử DOM, không chỉ các phần tử HTML
  • Giá trị của "cái này" được truyền cho sự kiện không phải là đối tượng toàn cầu (cửa sổ), mà là phần tử mà phần tử được kích hoạt. Điều này rất thuận tiện.
  • Mã cho các trình duyệt IE kế thừa rất đơn giản và được bao gồm trong tiêu đề "Legacy Internet Explorer và AttachEvent"
  • Bạn có thể bao gồm các tham số nếu bạn đặt trình xử lý trong một hàm ẩn danh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.