2009-09-29 32 views

Trả lời

141

Cả hai bộ xử lý sẽ chạy, mô hình sự kiện jQuery cho phép xử lý nhiều vào một yếu tố, do đó một handler sau không ghi đè lên một trình xử lý cũ.

The handlers will execute in the order in which they were bound.

+1

điều gì sẽ xảy ra theo cách riêng? và làm thế nào để người bản địa biết cách loại bỏ một cái cụ thể? – SuperUberDuper

+1

Theo DOM Cấp 3 (tham chiếu HTML 5 spec), trình xử lý sự kiện được thực thi theo thứ tự mà chúng được đăng ký - http://www.w3.org/TR/DOM-Level-3-Events/#event-phase và http://www.w3.org/TR/2014/REC-html5-20141028/webappapis.html#event-handler-attributes. Xử lý sự kiện có thể được loại bỏ bằng cách chuyển một tham chiếu đến trình xử lý đã được đăng ký –

+0

@RussCam điều gì sẽ xảy ra nếu cùng một trình xử lý bị ràng buộc nhiều hơn một lần cho phép chỉ nói 'jQuery ('. Btn'). 'được gọi ở những nơi khác nhau mà không thực sự' .off' nó bất kỳ? –

2

Cả hai trình xử lý đều được gọi.

Bạn có thể đang nghĩ đến inline event binding (ví dụ: "onclick=..."), trong đó hạn chế lớn nhất là chỉ một trình xử lý có thể được đặt cho một sự kiện.

jQuery phù hợp với DOM Level 2 event registration model:

DOM Event mẫu cho phép đăng ký của nhiều sự kiện thính giả trên EventTarget duy nhất. Để đạt được điều này, người nghe sự kiện sẽ không còn lưu trữ như thuộc tính giá trị

+0

bạn có biết thứ tự nào không? –

+0

@Rich: lệnh được chính thức không xác định. –

33

Giả sử rằng bạn có hai bộ xử lý, fg, và muốn chắc chắn rằng họ đang thực hiện theo một thứ tự đã biết và cố định, sau đó chỉ cần đóng gói chúng:

$("...").click(function(event){ 
    f(event); 
    g(event); 
}); 

Bằng cách này có (từ quan điểm của jQuery) chỉ một bộ xử lý, gọi fg theo thứ tự được chỉ định.

+3

+1, đóng gói bên trong một chức năng là cách để đi. Và thậm chí logic điều kiện tốt hơn có thể được chứa bên trong hàm điều khiển để kiểm soát (các) sự kiện được kích hoạt. –

+0

Điều này tốt hơn trong MHO – Sydwell

+0

Một bộ sưu tập các trình xử lý có chuỗi được xác định theo chương trình. –

8

Bạn sẽ có thể sử dụng chaining được kết để thực hiện các sự kiện theo thứ tự, ví dụ:

$('#target') 
    .bind('click',function(event) { 
    alert('Hello!'); 
    }) 
    .bind('click',function(event) { 
    alert('Hello again!'); 
    }) 
    .bind('click',function(event) { 
    alert('Hello yet again!'); 
    }); 

Tôi đoán mã dưới đây đang làm cùng

$('#target') 
     .click(function(event) { 
     alert('Hello!'); 
     }) 
     .click(function(event) { 
     alert('Hello again!'); 
     }) 
     .click(function(event) { 
     alert('Hello yet again!'); 
     }); 

Nguồn: http://www.peachpit.com/articles/article.aspx?p=1371947&seqNum=3

TFM cũng cho biết:

Khi một sự kiện đến một phần tử, tất cả các trình xử lý được liên kết với sự kiện đó loại cho phần tử được kích hoạt. Nếu có nhiều người xử lý đã đăng ký, họ sẽ luôn thực hiện theo thứ tự mà họ bị ràng buộc . Sau khi tất cả các trình xử lý đã được thực thi, sự kiện tiếp tục theo đường dẫn truyền sự kiện bình thường .

+1

Cả mã đó lẫn bài viết đó đều không xác định thứ tự xử lý thực thi. Có, đó là thứ tự sự kiện * binding * sẽ xảy ra, nhưng thứ tự xử lý sự kiện được gọi là vẫn chính thức không xác định. –

+0

ehh?điều gì về "Bây giờ khi sự kiện nhấp chuột xảy ra, trình xử lý sự kiện đầu tiên sẽ được gọi, tiếp theo là thứ hai, tiếp theo là thứ ba." Không rõ ràng? – anddoutoi

+0

và có, tôi biết rằng recs chính thức không xác định điều này và PPK đã chứng minh rằng việc thực hiện sự kiện là ngẫu nhiên nhưng có lẽ jQuery đã cố định này ^^ – anddoutoi

1

Có một giải pháp thay thế để đảm bảo rằng một trình xử lý xảy ra sau một trình xử lý khác: đính kèm trình xử lý thứ hai vào phần tử có chứa và để sự kiện phát tán. Trong trình xử lý được đính kèm với vùng chứa, bạn có thể xem event.target và làm điều gì đó nếu đó là thứ bạn quan tâm.

Thô, có thể, nhưng nó chắc chắn sẽ hoạt động.

2

Làm cho nó hoạt động thành công bằng cách sử dụng 2 phương pháp: đóng gói Stephan202 và nhiều trình xử lý sự kiện. Tôi có 3 tab tìm kiếm, chúng ta hãy xác định văn bản đầu vào id của họ trong một mảng:

var ids = new Array("searchtab1", "searchtab2", "searchtab3"); 

Khi hàm lượng thay đổi searchtab1, tôi muốn cập nhật searchtab2 và searchtab3. Đã làm nó theo cách này cho đóng gói:

for (var i in ids) { 
    $("#" + ids[i]).change(function() { 
     for (var j in ids) { 
      if (this != ids[j]) { 
       $("#" + ids[j]).val($(this).val()); 
      } 
     } 
    }); 
} 

Nhiều người nghe sự kiện:

for (var i in ids) { 
    for (var j in ids) { 
     if (ids[i] != ids[j]) { 
      $("#" + ids[i]).change(function() { 
       $("#" + ids[j]).val($(this).val()); 
      }); 
     } 
    } 
} 

Tôi thích cả hai phương pháp, nhưng các lập trình viên chọn đóng gói, tuy nhiên nhiều người nghe sự kiện cũng làm việc. Chúng tôi đã sử dụng Chrome để kiểm tra.

16

.bind jQuery() cháy theo thứ tự nó được ràng buộc:

Khi một sự kiện đạt một yếu tố, tất cả các bộ xử lý ràng buộc với loại sự kiện cho nguyên tố này được sa thải. Nếu có nhiều người xử lý đã đăng ký, họ sẽ luôn thực hiện theo thứ tự mà họ bị ràng buộc . Sau khi tất cả các trình xử lý đã được thực thi, sự kiện tiếp tục theo đường dẫn truyền sự kiện bình thường .

Nguồn: http://api.jquery.com/bind/

Bởi vì jQuery chức năng khác (. Ex .click()) là phím tắt cho .bind('click', handler), tôi sẽ đoán rằng họ cũng được kích hoạt theo thứ tự chúng đang bị ràng buộc.

Các vấn đề liên quan