Есть несколько полезных ответов, но, похоже, ни один из них не охватывает все последние варианты. С этой целью все мои примеры также учитывают наличие совпадающих label
элементов, а также позволяют динамически добавлять флажки и просматривать результаты на боковой панели (путем перенаправления console.log
).
Прослушивание click
событий на checkboxes
это не идея хороша , как не позволит клавиатуры переключени или изменений , когда соответствующий label
нажал элемент. Всегда прислушивайтесь к change
событию.
Используйте :checkbox
псевдоселектор jQuery , а не input[type=checkbox]
. :checkbox
короче и читабельнее.
Используйте is()
с :checked
псевдоселектором jQuery , чтобы проверить, установлен ли флажок. Это гарантированно работает во всех браузерах.
Базовый обработчик событий, прикрепленный к существующим элементам:
$('#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
мероприятие?
На самом деле это сделано специально. Если бы он действительно запустил событие, вы легко попали бы в ситуацию бесконечных обновлений. Вместо этого после изменения свойства checked отправьте событие изменения тому же элементу, используя trigger
(not 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, если вы не планируете манипулировать им.