Birkaç yararlı cevap var, ancak hiçbiri en son seçenekleri kapsamıyor gibi görünüyor . Bu amaçla tüm örneklerim, eşleşen label
öğelerin varlığına da hitap eder ve ayrıca dinamik olarak onay kutuları eklemenize ve sonuçları bir yan panelde (yeniden yönlendirerek console.log
) görmenize izin verir .
Dinleme click
ile ilgili olayların checkboxes
olduğu değil o klavye toggle için veya eşleşen bir yerde yapılan değişiklikler için izin vermeyecektir olarak iyi bir fikir label
elemanı tıklandığı. Daima change
etkinliği dinleyin .
Bunun :checkbox
yerine jQuery sözde seçici kullanın input[type=checkbox]
. :checkbox
daha kısa ve daha okunabilir.
Bir onay kutusunun işaretli olup olmadığını test etmek için is()
jQuery :checked
sözde seçici ile kullanın . Bunun tüm tarayıcılarda çalışacağı garanti edilir.
Mevcut öğelere bağlı temel olay işleyici:
$('#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/
Notlar:
:checkbox
Kullanmayı tercih eden seçiciyi kullanırinput[type=checkbox]
- Bu yalnızca etkinliğin kaydedildiği sırada var olan eşleşen öğelere bağlanır .
Ata öğesine eklenmiş yetki verilen olay işleyicisi:
Yetki verilen olay işleyicileri, öğelerin henüz bulunamayabileceği (dinamik olarak yüklenmiş veya oluşturulmuş) durumlar için tasarlanmıştır ve çok yararlıdır. Onlar temsilci ata elemanın (bu nedenle dönem) sorumluluğu.
$('#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/
Notlar:
- Bu,
change
değişmeyen bir ata elemanına (bu durumda #myform
) patlamak için olayları (bu durumda ) dinleyerek çalışır .
- Daha sonra jQuery seçiciyi (
':checkbox'
bu durumda) yalnızca kabarcık zincirindeki elemanlara uygular .
- Daha sonra olay işleyici işlevini yalnızca olaya neden olan eşleşen öğelere uygular.
document
Başka hiçbir şey daha yakın / uygun değilse, yetki verilen olay işleyicisini bağlamak için varsayılan olarak kullanın .
body
Yetki verilen olayları eklemek için kullanmayın , çünkü fare olaylarını almasını durdurabilecek bir hata vardır (stil ile ilgili).
Temsilci işleyicilerin sonucu, eşleşen öğelerin olay işleyicisinin kaydedildiği zaman değil, yalnızca olay zamanında olması gerektiğidir. Bu, dinamik olarak eklenen içeriğin olayları oluşturmasına izin verir.
S: Daha yavaş mı?
Y: Olaylar kullanıcı etkileşimi hızlarında olduğu sürece, yetki verilen bir olay işleyicisi ile doğrudan bağlı bir işleyici arasındaki önemsiz hız farkı konusunda endişelenmenize gerek yoktur . Delegasyonun faydaları küçük bir dezavantajdan çok daha ağır basmaktadır. Yetki verilen olay işleyicileri, genellikle tek bir eşleşen öğeye bağlandıkları için kaydolmak daha hızlıdır .
Neden gelmez prop('checked', true)
yangın change
olayı?
Bu aslında tasarım gereğidir. Eğer olayı başlatırsa, sonsuz güncellemeler durumuna kolayca girersiniz. Bunun yerine, işaretli özelliği değiştirdikten sonra aynı öğeye trigger
(not triggerHandler
) kullanarak bir change olayı gönderin :
örneğin trigger
hiçbir olay olmazsa
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
örneğin trigger
normal değişiklik olayı yakalandığında
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Notlar:
triggerHandler
Bir kullanıcı tarafından önerilen şekilde kullanmayın , çünkü etkinlikleri yetki verilen bir olay işleyicisine aktarmaz.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
o halde olacak bir olay işleyicisi için işe doğrudan bağlı elemana:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
.TriggerHandler () ile tetiklenen olaylar DOM hiyerarşisini patlatmaz; hedef eleman tarafından doğrudan ele alınmazlarsa hiçbir şey yapmazlar.
Referans: http://api.jquery.com/triggerhandler/
Herkesin bu kapsamda olmadığını düşündüğü ek özellikleri varsa, lütfen eklemeyi önerin .
this
onay kutusunun DOM öğesine zaten ayarlanmışthis.checked
olduğundan yeterlidir. Eğer üzerinde değişiklik yapmayı planlamazsanız, başka bir jQuery nesnesi oluşturmanız gerekmez.