Trước khi bạn đọc điều này, hãy kéo danh sách các sự kiện này lên trên một trang khác, bản thân API rất hữu ích và tất cả những gì tôi đang thảo luận dưới đây được liên kết trực tiếp từ trang này .
Đầu tiên, theo .click(function)
nghĩa đen là một phím tắt cho .bind('click', function)
, chúng là tương đương. Sử dụng chúng khi liên kết một trình xử lý trực tiếp với một phần tử , như thế này:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Nếu phần tử này được thay thế hoặc vứt đi, trình xử lý này sẽ không còn ở đó nữa. Ngoài ra các phần tử không có ở đó khi mã này được chạy để đính kèm trình xử lý (ví dụ: bộ chọn tìm thấy nó sau đó) sẽ không nhận được trình xử lý.
.live()
và .delegate()
có liên quan tương tự nhau, .delegate()
thực sự sử dụng .live()
nội bộ, cả hai đều lắng nghe các sự kiện để bong bóng. Điều này làm việc cho các yếu tố mới và cũ , họ bong bóng các sự kiện theo cùng một cách. Bạn sử dụng những thứ này khi các yếu tố của bạn có thể thay đổi, ví dụ: thêm các hàng mới, liệt kê các mục, v.v. Nếu bạn không có cha mẹ / tổ tiên chung sẽ ở lại trang và không bị thay thế tại bất kỳ thời điểm nào, hãy sử dụng .live()
, như sau:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Tuy nhiên, nếu bạn có một phần tử cha mẹ ở đâu đó không được thay thế (vì vậy các trình xử lý sự kiện của nó sẽ không tạm biệt), bạn nên xử lý nó .delegate()
, như thế này:
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Điều này hoạt động gần giống như .live()
, nhưng sự kiện bong bóng ít lần hơn trước khi bị bắt và xử lý. Một cách sử dụng phổ biến khác của cả hai trường hợp này là lớp của bạn thay đổi trên một phần tử, không còn phù hợp với bộ chọn mà bạn đã sử dụng ban đầu ... với các phương thức này, bộ chọn được đánh giá tại thời điểm diễn ra sự kiện , nếu nó phù hợp, trình xử lý sẽ chạy .. .như phần tử không còn phù hợp với bộ chọn nữa, nó sẽ không thực thi nữa. Với .click()
Tuy nhiên, xử lý sự kiện là ràng buộc ngay trên phần tử DOM, thực tế là nó không phù hợp với bất cứ điều gì chọn được sử dụng để tìm thấy nó là không thích hợp ... sự kiện này được ràng buộc và nó ở lại cho đến khi yếu tố đó đã biến mất, hoặc xử lý được gỡ bỏ thông qua .unbind()
.
Một cách sử dụng phổ biến khác cho .live()
và .delegate()
là hiệu suất . Nếu bạn đang xử lý nhiều yếu tố, việc gắn trình xử lý nhấp trực tiếp vào từng yếu tố sẽ tốn kém và mất thời gian. Trong những trường hợp này sẽ kinh tế hơn khi thiết lập một trình xử lý duy nhất và để bong bóng thực hiện công việc, hãy xem câu hỏi này nơi nó tạo ra sự khác biệt lớn , đó là một ví dụ tốt về ứng dụng.
Kích hoạt - cho câu hỏi cập nhật
Có 2 chức năng kích hoạt trình xử lý sự kiện chính khả dụng, chúng thuộc cùng loại "Đính kèm Trình xử lý sự kiện" trong API , đó là .trigger()
và .triggerHandler()
. .trigger('eventName')
có một số phím tắt được tích hợp sẵn cho các sự kiện phổ biến, ví dụ:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Bạn có thể xem một danh sách bao gồm các phím tắt ở đây .
Đối với sự khác biệt, .trigger()
kích hoạt trình xử lý sự kiện (nhưng không phải là hành động mặc định hầu hết thời gian, ví dụ: đặt con trỏ ở vị trí bên phải trong một lần nhấp <textarea>
). Nó làm cho các trình xử lý sự kiện xảy ra theo thứ tự mà chúng bị ràng buộc (như sự kiện gốc sẽ xảy ra), kích hoạt các hành động sự kiện riêng và làm nổi lên DOM.
.triggerHandler()
thường là cho một mục đích khác, ở đây bạn chỉ đang cố gắng xử lý (các) trình xử lý bị ràng buộc, nó không gây ra sự kiện bản địa để kích hoạt, ví dụ như gửi biểu mẫu. Nó không làm bong bóng DOM và nó không thể kết nối được (nó trả về bất cứ thứ gì xử lý sự kiện ràng buộc cuối cùng cho sự kiện đó trả về). Ví dụ: nếu bạn muốn kích hoạt một focus
sự kiện nhưng không thực sự tập trung vào đối tượng, bạn chỉ muốn mã bạn bị ràng buộc .focus(fn)
để chạy, điều này sẽ làm điều đó, trong khi đó .trigger()
sẽ làm điều đó cũng như thực sự tập trung vào phần tử và bong bóng.
Đây là một ví dụ thực tế:
$("form").submit(); //actually calling `.trigger('submit');`
Điều này sẽ chạy bất kỳ trình xử lý gửi nào, ví dụ như trình cắm xác thực jQuery , sau đó thử gửi <form>
. Tuy nhiên, nếu bạn chỉ muốn xác thực, vì nó được kết nối thông qua một submit
trình xử lý sự kiện, nhưng không gửi <form>
sau đó, bạn có thể sử dụng .triggerHandler('submit')
, như thế này:
$("form").triggerHandler('submit');
Plugin ngăn trình xử lý gửi biểu mẫu bằng cách bỏ qua nếu kiểm tra xác thực không vượt qua, nhưng với phương pháp này, chúng tôi không quan tâm nó làm gì. Cho dù nó có bị hủy bỏ hay không, chúng tôi không cố gắng gửi biểu mẫu, chúng tôi chỉ muốn kích hoạt nó để xác thực lại và không làm gì khác. ( Tuyên bố miễn trừ trách nhiệm: Đây là một ví dụ không cần thiết vì có một .validate()
phương thức trong plugin, nhưng đó là một minh họa rõ ràng về ý định)