Є кілька корисних відповідей, але жодна не охоплює всіх останніх варіантів. З цією метою всі мої приклади також забезпечують наявність відповідних labelелементів, а також дозволяють динамічно додавати прапорці та бачити результати на бічній панелі (шляхом перенаправлення console.log).
Прослуховування clickподій увімкнено checkboxes- це не дуже гарна ідея, оскільки це не дозволить змінити клавіатуру чи зміни, внесені в результаті labelнатискання відповідного елемента. Завжди слухайте changeподію.
Використовуйте псевдоселектор jQuery :checkbox, а не input[type=checkbox]. :checkboxкоротше і читабельніше.
Використовуйте is()за допомогою псевдоселектора jQuery, :checkedщоб перевірити, чи встановлено прапорець. Це гарантовано працює у всіх браузерах.
Основний обробник подій, що додається до існуючих елементів:
$('#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/
Примітки:
- Використовує
:checkboxселектор, який є кращим для використанняinput[type=checkbox]
- Це підключається лише до відповідних елементів, які існують на момент реєстрації події.
Делегований обробник подій, приєднаний до елемента предка:
Делеговані обробники подій призначені для ситуацій, коли елементи ще не існують (динамічно завантажуються або створюються) і є дуже корисними. Вони делегують відповідальність елементу предка (звідси термін).
$('#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/
Примітки:
- Це працює, прослуховуючи події (в даному випадку
change), щоб піднятися до елемента, що не змінюється (в даному випадку #myform).
- Потім він застосовує селектор jQuery (
':checkbox'в даному випадку) лише до елементів ланцюга бульбашок .
- Потім він застосовує функцію обробника подій лише до тих елементів, які відповідають, що спричинили подію.
- Використовуйте
documentяк за замовчуванням для підключення делегованого обробника подій, якщо нічого іншого не ближче / зручніше.
- Не використовуйте
bodyдля приєднання делегованих подій, оскільки у ньому є помилка (пов’язана зі стилізацією), яка може зупинити її отримання подій миші.
Підсумок делегованих обробників полягає в тому, що відповідні елементи повинні існувати лише в час події, а не тоді, коли обробник події був зареєстрований. Це дозволяє динамічно додавати вміст для генерації подій.
Q: Це повільніше?
Відповідь: Поки події відбуваються зі швидкістю взаємодії з користувачем, вам не потрібно турбуватися про незначну різницю швидкості між делегованим обробником подій та безпосередньо підключеним обробником. Переваги делегації значно перевищують будь-який незначний недолік. Делеговані обробники подій насправді швидше реєструються, оскільки вони зазвичай підключаються до одного відповідного елемента.
Чому не prop('checked', true)припиняється changeподія?
Це насправді задумом. Якщо це призвело до події, ви легко потрапите в ситуацію нескінченних оновлень. Натомість після зміни позначеної властивості надішліть подію зміни до того ж елемента, використовуючи trigger(не triggerHandler):
наприклад, без triggerжодної події не відбувається
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
наприклад, з triggerнормальною подією зміни відбувається
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
Примітки:
- Не використовуйте так,
triggerHandlerяк запропонував один користувач, оскільки це не буде міхувати події делегованому оброблювачу подій.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
хоча він буде працювати для обробника подій, безпосередньо підключеного до елемента:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
Події, запущені за допомогою .triggerHandler (), не змішують ієрархію DOM; якщо вони не обробляються цільовим елементом безпосередньо, вони нічого не роблять.
Довідка: http://api.jquery.com/triggerhandler/
Якщо хтось має додаткові функції, які, на їхню думку, не охоплені цим, будь ласка, запропонуйте доповнення .
thisвже встановлено для елемента DOM прапорця, томуthis.checkedдостатньо. Вам не потрібно буде створювати для нього інший об’єкт jQuery, якщо ви не плануєте маніпулювати ним.