Có một số câu trả lời hữu ích, nhưng dường như không có câu trả lời nào bao gồm tất cả các tùy chọn mới nhất . Cuối cùng, tất cả các ví dụ của tôi cũng phục vụ cho sự hiện diện của label
các yếu tố phù hợp và cũng cho phép bạn tự động thêm các hộp kiểm và xem kết quả trong bảng điều khiển bên (bằng cách chuyển hướng console.log
).
Lắng nghe cho click
các sự kiện trên checkboxes
là không một ý tưởng tốt như rằng sẽ không cho phép bàn phím toggling hoặc thay đổi được thực nơi một kết hợp label
yếu tố được nhấp. Luôn luôn lắng nghe change
sự kiện.
Sử dụng :checkbox
bộ chọn giả jQuery , chứ không phải input[type=checkbox]
. :checkbox
ngắn hơn và dễ đọc hơn.
Sử dụng is()
với :checked
bộ chọn giả jQuery để kiểm tra xem hộp kiểm có được chọn hay không. Điều này được đảm bảo để làm việc trên tất cả các trình duyệt.
Trình xử lý sự kiện cơ bản gắn liền với các yếu tố hiện có:
$('#myform :checkbox').change(function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
Mã nguồn: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/2/
Ghi chú:
- Sử dụng
:checkbox
bộ chọn, thích hợp hơn để sử dụnginput[type=checkbox]
- Điều này chỉ kết nối với các yếu tố phù hợp tồn tại tại thời điểm sự kiện được đăng ký.
Trình xử lý sự kiện được ủy quyền gắn với phần tử tổ tiên:
Trình xử lý sự kiện được ủy nhiệm được thiết kế cho các tình huống mà các phần tử có thể chưa tồn tại (được tải hoặc tạo động) và rất hữu ích. Họ ủy thác trách nhiệm cho một yếu tố tổ tiên (do đó là thuật ngữ).
$('#myform').on('change', ':checkbox', function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/4/
Ghi chú:
- Điều này hoạt động bằng cách lắng nghe các sự kiện (trong trường hợp này
change
) để tạo ra một yếu tố tổ tiên không thay đổi (trong trường hợp này #myform
).
- Sau đó, nó áp dụng bộ chọn jQuery (
':checkbox'
trong trường hợp này) chỉ cho các phần tử trong chuỗi bong bóng .
- Sau đó, nó áp dụng chức năng xử lý sự kiện cho chỉ những phần tử phù hợp gây ra sự kiện.
- Sử dụng
document
làm mặc định để kết nối trình xử lý sự kiện được ủy quyền, nếu không có gì khác gần hơn / thuận tiện.
- Không sử dụng
body
để đính kèm các sự kiện được ủy quyền vì nó có một lỗi (liên quan đến kiểu dáng) có thể ngăn nó nhận các sự kiện chuột.
Kết quả cuối cùng của các trình xử lý được ủy quyền là các phần tử khớp chỉ cần tồn tại tại thời điểm sự kiện chứ không phải khi trình xử lý sự kiện được đăng ký. Điều này cho phép nội dung được thêm động để tạo các sự kiện.
Q: Có chậm hơn không?
Trả lời: Miễn là các sự kiện ở tốc độ tương tác người dùng, bạn không cần phải lo lắng về sự khác biệt không đáng kể về tốc độ giữa trình xử lý sự kiện được ủy quyền và trình xử lý được kết nối trực tiếp. Những lợi ích của phái đoàn vượt xa bất kỳ nhược điểm nhỏ. Trình xử lý sự kiện được ủy nhiệm thực sự nhanh hơn để đăng ký vì chúng thường kết nối với một yếu tố phù hợp duy nhất.
Tại sao không prop('checked', true)
bắn các change
sự kiện?
Điều này thực sự là do thiết kế. Nếu nó phát sinh sự kiện, bạn sẽ dễ dàng rơi vào tình huống cập nhật vô tận. Thay vào đó, sau khi thay đổi thuộc tính được kiểm tra, hãy gửi một sự kiện thay đổi đến cùng một phần tử bằng cách sử dụng trigger
(không triggerHandler
):
ví dụ như không trigger
có sự kiện nào xảy ra
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
ví dụ với trigger
sự kiện thay đổi bình thường bị bắt
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Ghi chú:
- Không sử dụng
triggerHandler
như được đề xuất bởi một người dùng, vì nó sẽ không tạo ra các sự kiện cho người xử lý sự kiện được ủy quyền .
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
mặc dù nó sẽ hoạt động cho một trình xử lý sự kiện được kết nối trực tiếp với phần tử:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
Các sự kiện được kích hoạt bằng .triggerHandler () không tạo ra cấu trúc phân cấp DOM; nếu chúng không được xử lý trực tiếp bởi phần tử đích, chúng không làm gì cả.
Tham khảo: http://api.jquery.com/triggerhandler/
Nếu bất cứ ai có các tính năng bổ sung mà họ cảm thấy không được bảo vệ bởi điều này, xin vui lòng đề xuất bổ sung .
this
đã được đặt thành phần tử DOM của hộp kiểm trathis.checked
là đủ. Bạn sẽ không cần phải tạo một đối tượng jQuery khác cho nó trừ khi bạn có kế hoạch thao túng nó.