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


138

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

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

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

Ответы:


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

Признавая тот факт, что спрашивающий специально запросил 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');
    }
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.