Ada beberapa jawaban yang berguna, tetapi tampaknya tidak ada yang mencakup semua opsi terbaru . Untuk itu, semua contoh saya juga memenuhi keberadaan label
elemen yang cocok dan juga memungkinkan Anda menambahkan kotak centang secara dinamis dan melihat hasilnya di panel samping (dengan mengarahkan ulang console.log
).
Mendengarkan click
acara di checkboxes
adalah tidak ide yang baik karena yang tidak akan memungkinkan untuk keyboard Toggling atau perubahan yang dibuat di mana pencocokan label
elemen diklik. Dengarkan selalu change
acaranya.
Gunakan :checkbox
pseudo-selector jQuery , bukan input[type=checkbox]
. :checkbox
lebih pendek dan lebih mudah dibaca.
Gunakan is()
dengan :checked
selektor-semu jQuery untuk menguji apakah kotak centang dicentang. Ini dijamin bekerja di semua browser.
Penangan kejadian dasar yang dilampirkan ke elemen yang ada:
$('#myform :checkbox').change(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/2/
Catatan:
- Menggunakan
:checkbox
selektor, yang lebih disukai daripada menggunakaninput[type=checkbox]
- Ini hanya menghubungkan ke elemen yang cocok yang ada pada saat acara itu terdaftar.
Penangan peristiwa yang didelegasikan yang dilampirkan ke elemen leluhur:
Penangan peristiwa yang didelegasikan dirancang untuk situasi di mana elemen mungkin belum ada (dimuat atau dibuat secara dinamis) dan sangat berguna. Mereka mendelegasikan tanggung jawab kepada elemen leluhur (karena itu istilahnya).
$('#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/
Catatan:
- Ini bekerja dengan mendengarkan kejadian (dalam kasus ini
change
) untuk melambung ke elemen leluhur yang tidak berubah (dalam kasus ini #myform
).
- Ini kemudian menerapkan pemilih jQuery (
':checkbox'
dalam hal ini) hanya ke elemen dalam rantai gelembung .
- Ini kemudian menerapkan fungsi penanganan kejadian hanya untuk elemen yang cocok yang menyebabkan kejadian.
- Gunakan
document
sebagai default untuk menghubungkan event handler yang didelegasikan, jika tidak ada yang lebih dekat / nyaman.
- Jangan gunakan
body
untuk melampirkan acara yang didelegasikan karena memiliki bug (berkaitan dengan gaya) yang dapat menghentikannya mendapatkan peristiwa mouse.
Hasil dari penangan yang didelegasikan adalah bahwa elemen yang cocok hanya perlu ada pada waktu peristiwa dan bukan saat penangan peristiwa didaftarkan. Ini memungkinkan konten yang ditambahkan secara dinamis untuk menghasilkan acara.
T: Apakah lebih lambat?
J: Selama peristiwa berada pada kecepatan interaksi pengguna, Anda tidak perlu khawatir tentang perbedaan kecepatan yang dapat diabaikan antara pengendali peristiwa yang didelegasikan dan pengendali yang terhubung langsung. Manfaat pendelegasian jauh lebih besar daripada kerugian kecil apa pun. Penangan peristiwa yang didelegasikan sebenarnya lebih cepat didaftarkan karena biasanya terhubung ke satu elemen yang cocok.
Mengapa tidak prop('checked', true)
menghentikan change
acara tersebut?
Ini sebenarnya dengan desain. Jika itu benar-benar memecat acara, Anda akan dengan mudah masuk ke situasi pembaruan tanpa akhir. Sebagai gantinya, setelah mengubah properti yang dicentang, kirim peristiwa perubahan ke elemen yang sama menggunakan trigger
(bukan triggerHandler
):
misalnya tanpa trigger
ada peristiwa yang terjadi
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
misalnya dengan trigger
peristiwa perubahan normal tertangkap
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Catatan:
- Jangan gunakan
triggerHandler
seperti yang disarankan oleh satu pengguna, karena ini tidak akan menggembungkan peristiwa ke penangan peristiwa yang didelegasikan .
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
meskipun itu akan bekerja untuk penangan kejadian yang terhubung langsung ke elemen:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
Peristiwa yang dipicu dengan .triggerHandler () tidak memunculkan hierarki DOM; jika mereka tidak ditangani oleh elemen target secara langsung, mereka tidak melakukan apa-apa.
Referensi: http://api.jquery.com/triggerhandler/
Jika ada yang memiliki fitur tambahan yang mereka rasa tidak tercakup oleh ini, mohon saran penambahan .
this
sudah disetel ke elemen DOM kotak centang jadithis.checked
sudah cukup. Anda tidak perlu membuat objek jQuery lain untuk itu kecuali jika Anda berencana untuk memanipulasinya.