обработка событий флажка jQuery

138

Имею следующее:

<form id="myform">
   <input type="checkbox" name="check1" value="check1">
   <input type="checkbox" name="check2" value="check2">
</form>

Как использовать jQuery, чтобы зафиксировать любое событие проверки, которое происходит, myformи сообщить, какой флажок был включен (и узнать, был ли он включен или выключен)?

aeq
источник

Ответы:

247
$('#myform :checkbox').change(function() {
    // this will contain a reference to the checkbox   
    if (this.checked) {
        // the checkbox is now checked 
    } else {
        // the checkbox is now no longer checked
    }
});
Дарин Димитров
источник
30
thisуже установлен для элемента DOM флажка, поэтому this.checkedдостаточно. Вам не нужно будет создавать для него другой объект jQuery, если вы не планируете манипулировать им.
Walf
18
Небольшая подсказка. Вы получите повышение производительности, используя поле input: checkbox в вашем селекторе, а не просто: checkbox, поскольку последний переводится в универсальный селектор *: checkbox.
jimmystormig 01
23
Щелчок не находится рядом с каким-либо событием проверки.
Питер
27
Это далеко не лучший ответ. Если у вас есть соответствующая метка для вашего ввода (например, <label for='myInput'>Checkbox:</label><input id='myInput' name='myInput' type='checkbox'/>), и вы щелкнете по метке, флажок будет установлен, но эта функция НЕ будет вызываться. Вы должны использовать .change()событие
Патрик
7
Этот ответ не дает полного ответа - см. Ответ Анурага ниже, который является НАМНОГО более полным (и точным) ответом. Этот ответ, конечно, частично правильный, но, как уже говорилось, это не лучший ответ.
Carnix
131

Используйте событие изменения.

$('#myform :checkbox').change(function() {
    // this represents the checkbox that was checked
    // do something with it
});
Анураг
источник
5
Если флажок скрыт, пользователь не сможет с ним взаимодействовать. Дайте мне знать, если вы имели в виду что-то еще.
Anurag
1
Это не срабатывает $("input[name=check1]").prop('checked', true). См. Jsfiddle.net/Z3E8V/2
Питер,
15
Это задумано. Программное изменение свойства элемента DOM не запускает связанные обработчики событий. Их придется запускать вручную.
Anurag
6
Это должен быть выбранный ответ, он охватывает нажатие метки флажка
Патрик
3
Из документации jQuery: «Поскольку :checkboxэто расширение jQuery, а не часть спецификации CSS, запросы, использующие :checkboxего, не могут воспользоваться преимуществом повышения производительности, обеспечиваемого собственным querySelectorAll()методом DOM . Для повышения производительности в современных браузерах используйте [type="checkbox"]вместо этого».
NXT
55

Есть несколько полезных ответов, но, похоже, ни один из них не охватывает все последние варианты. С этой целью все мои примеры также учитывают наличие совпадающих 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/

Если у кого-то есть дополнительные функции, которые, по его мнению, не охватываются этим, предложите дополнения .

Исчезло кодирование
источник
33

Использование нового метода on в jQuery (1.7): http://api.jquery.com/on/

    $('#myform').on('change', 'input[type=checkbox]', function(e) {
        console.log(this.name+' '+this.value+' '+this.checked);

    });
  • обработчик событий будет жить
  • будет фиксировать, если флажок был изменен с клавиатуры, а не просто щелкнуть
Аллен Гамильтон
источник
1
Это не срабатывает $("input[name=check1]").prop('checked', true). См. Jsfiddle.net/Z3E8V/2
Питер,
7
Просто добавь .triggerHandler('change');после .propзвонка. Затем он переключит поле И вызовет событие.
Hanna
альтернатива: $ (document) .on ('change', 'input [type = "checkbox"]', function () {$ ('input [type = "checkbox"]'). not (this) .prop ( 'checked', false);});
Юсаф Абдулла,
5
$('#myform input:checkbox').click(
 function(e){
   alert($(this).is(':checked'))
 }
)
Мыслитель
источник
val()не сообщает вам, если checkedесть true.
Walf
5

Признавая тот факт, что спрашивающий специально запросил jQuery и что выбранный ответ верен, следует отметить, что эта проблема фактически не требует jQuery. Если кто-то желает решить эту проблему без этого, можно просто установить onClickатрибут флажков, которым он или она хочет добавить дополнительные функции, например:

HTML:

<form id="myform">
  <input type="checkbox" name="check1" value="check1" onClick="cbChanged(this);">
  <input type="checkbox" name="check2" value="check2" onClick="cbChanged(this);">
</form>

javascript:

function cbChanged(checkboxElem) {
  if (checkboxElem.checked) {
    // Do something special
  } else {
    // Do something else
  }
}

Скрипка: http://jsfiddle.net/Y9f66/1/

Чейз Сандманн
источник
5
Конечно, размещение обработчиков событий непосредственно в HTML работает. Но это прямо противоречит методикам DRY и прогрессивного улучшения. Более точным ответом будет «Вам не нужен jQuery для добавления обработчиков событий», и вместо этого используйте стандартный JS для присоединения обработчиков кликов в отдельном JS-файле вместо того, чтобы помещать атрибуты onclick в HTML. Это «работает», но хорошая практика кодирования диктует, что вы должны избегать этого, когда это возможно (что почти всегда на данном этапе, если только вы не должны поддерживать IE6 или что-то в этом роде, что даже MS говорит, что вы больше не должны этого делать)
Carnix
3

Я попробовал код из первого ответа, он не работает, но у меня есть игра, и эта работа для меня

$('#vip').change(function(){
    if ($(this).is(':checked')) {
        alert('checked');
    } else {
        alert('uncheck');
    }
});
Somwang Souksavatd
источник