Є кілька корисних відповідей, але жодна не охоплює всіх останніх варіантів. З цією метою всі мої приклади також забезпечують наявність відповідних 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, якщо ви не плануєте маніпулювати ним.