jQuery, флажки и .is («: проверено»)

88

Когда я привязываю функцию к элементу флажка, например:

$("#myCheckbox").click( function() {
    alert($(this).is(":checked"));
});

Флажок изменяет свой атрибут checked до того, как событие запускается, это нормальное поведение и дает обратный результат.

Однако когда я это сделаю:

$("#myCheckbox").click();

Флажок изменяет свой отмеченный атрибут после срабатывания события.

Мой вопрос: есть ли способ вызвать событие щелчка из jQuery, как это делает обычный щелчок (первый сценарий)?

PS: Я уже пробовал trigger('click');

Бен
источник
5
Я только что это проверил. Вы совершенно правы. Но это , кажется , что это может быть ошибка. Я бы назвал
cletus
1
А как насчет события «изменения»?
ZippyV
@cletus Действительно, это ошибка JQuery 1.4.2. 1.3.2 работает нормально.
Бен
Я наблюдаю одно и то же поведение в 1.4.2 и 1.3.2: jsfiddle.net/HCUNn
Ник
@Nick Он по-прежнему действует противоположно тому, что делал бы обычный щелчок мышью. Честно говоря, я не знаю, почему 1.3.2 у меня работает, а 1.4.2 - нет, но все же это нужно изменить.
Бен

Ответы:

98
$('#myCheckbox').change(function () {
    if ($(this).prop("checked")) {
        // checked
        return;
    }
    // not checked
});

Примечание. В старых версиях jquery его можно было использовать attr. Теперь предлагается использоватьprop для чтения состояния.

tcurdt
источник
1
Я пробовал это, «$ (# myCheckbox) .click ()» снимает / проверяет флажок, но функция изменения никогда не запускается. Я также пробовал изменить атрибут 'checked' вместо вызова click () и даже установить для функции 'change' значение 'live'.
Бен
@Ben - Вы должны запустить его по-другому, чтобы он запустился, см. Мой ответ на оператор триггера.
Ник Крейвер
@Nick Спасибо, я приму ответ tcurdt, так как он был первым, кто предложил решение. Глупый, я не задействовал метод «изменения».
Бен
19
а для более новых версий jquery функция prop ("проверено") вместо attr ("проверено") на случай, если кто-то уловит.
danski
Я бы избегал 'опоры' из-за отсутствия обратной совместимости, особенно. в IE.
vapcguy
27

В jQuery 1.3.2 и 1.4.2 есть обходной путь :

$("#myCheckbox").change( function() {
    alert($(this).is(":checked"));
});

//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');​​​​​​​​​​​​​

Но я согласен, такое поведение кажется ошибочным по сравнению с исходным событием.

Ник Крейвер
источник
10

По состоянию на июнь 2016 года (с использованием jquery 2.1.4) ни одно из других предлагаемых решений не работает. Проверка attr('checked')всегда возвращается undefinedи is('checked)всегда возвращается false.

Просто используйте метод prop:

$("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});
безатомный
источник
2
is('checked)вернет false, потому что "checked" не является псевдоселектором CSS. Правильный вариант должен быть is(':checked')таким, чтобы вместо этого выполнялся поиск ": checked".
dhaupin
4

Я все еще испытываю такое поведение с jQuery 1.7.2. Простой обходной путь - отложить выполнение обработчика кликов с помощью setTimeout и позволить браузеру тем временем творить чудеса:

$("#myCheckbox").click( function() {
    var that = this;
    setTimeout(function(){
        alert($(that).is(":checked"));
    });
});
Срджан Станич
источник
Ага! Немного оффтоп, но я должен был сделать то же самое в сетках Kendo с флажками, когда кто-то нажимал «Добавить новую запись», если я хотел, чтобы она была «Активной» по умолчанию. Я также должен был дать ему время 500 мс. Затем мне пришлось добавить .click(), затем установить .attr('value', 'true'), затем .change(), затем, .blur()прежде чем он программно установил бы поле, когда я программно щелкнул кнопку «Обновить» ....
vapcguy
2

Если вы ожидаете этого довольно нежелательного поведения, то одним из возможных вариантов будет передача дополнительного параметра из jQuery.trigger () обработчику кликов флажка. Этот дополнительный параметр предназначен для уведомления обработчика кликов о том, что щелчок был инициирован программно, а не пользователем, непосредственно устанавливающим флажок. Затем обработчик щелчка флажка может инвертировать отчетный статус проверки.

Итак, вот как я бы инициировал событие click для флажка с идентификатором myCheckBox. Обратите внимание, что я также передаю параметр объекта с одним членом, nonUI, для которого установлено значение true:

$("#myCheckbox").trigger('click', {nonUI : true})

И вот как я обрабатываю это в обработчике события щелчка флажка. Функция обработчика проверяет наличие объекта, отличного от пользовательского интерфейса, в качестве второго параметра. (Первым параметром всегда является само событие.) Если параметр присутствует и установлен в значение true, я инвертирую сообщаемый статус .checked. Если такой параметр не передается - чего не будет, если пользователь просто щелкнет флажок в пользовательском интерфейсе - я сообщаю фактический статус .checked:

$("#myCheckbox").click(function(e, parameters) {
   var nonUI = false;
        try {
            nonUI = parameters.nonUI;
        } catch (e) {}
        var checked = nonUI ? !this.checked : this.checked;
        alert('Checked = ' + checked);
    });

Версия JSFiddle на http://jsfiddle.net/BrownieBoy/h5mDZ/

Я тестировал Chrome, Firefox и IE 8.

Холодный Пингвин
источник
2
<input id="widget-wpb_widget-3-custom_date" class="mycheck" type="checkbox" value="d/M/y" name="widget-wpb_widget[3][custom_date]" unchecked="true">    

var atrib = $('.mycheck').attr("unchecked",true);
$('.mycheck').click(function(){
if ($(this).is(":checked")) 
{
$('.mycheck').attr("unchecked",false);
   alert("checkbox checked");
}
else
{
$('.mycheck').attr("unchecked",true);
 alert("checkbox unchecked");
}
});
Теджас Сони
источник
Несколько комментариев было бы неплохо
Данил Гапонов
1
  $("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});
Супермен
источник
1
$("#personal").click(function() {
      if ($(this).is(":checked")) {
            alert('Personal');
        /* var validator = $("#register_france").validate(); 
        validator.resetForm(); */
      }
            }
            );

JSFIDDLE

Сурья Р. Правин
источник
0

Что ж, чтобы соответствовать первому сценарию, это то, что я придумал.

http://jsbin.com/uwupa/edit

По сути, вместо того, чтобы связывать событие «щелчок», вы связываете событие «изменение» с предупреждением.

Затем, когда вы запускаете событие, сначала вы запускаете щелчок, а затем запускаете изменение.

Рассел Урести
источник
0

В дополнение к ответу Ника Крейвера, чтобы это работало правильно, IE 8вам необходимо добавить дополнительный обработчик кликов в флажок:

// needed for IE 8 compatibility
if ($.browser.msie)
    $("#myCheckbox").click(function() { $(this).trigger('change'); });

$("#myCheckbox").change( function() {
    alert($(this).is(":checked"));
});

//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');

В противном случае обратный вызов будет срабатывать только тогда, когда флажок теряет фокус, поскольку IE 8сохраняет фокус на флажках и радиомодулях при их нажатии.

IE 9Хотя еще не тестировал .

Юрий Генцев
источник
0
$( "#checkbox" ).change(function() {
    if($(this).is(":checked")){
        alert('hi');
    }

});
user3607804
источник
1
Пожалуйста, упомяните некоторые подробности
CodeWarrior
Похоже, это просто повторный ответ, использующий changeвместо OP click, и просто использующий ifоператор как другой способ тестирования :checked.
vapcguy
-1

Самый быстрый и простой способ :

$('#myCheckbox').change(function(){
    alert(this.checked);
});

$el[0].checked;

$ el - элемент выделения jquery.

Наслаждайтесь!

Максим К.
источник
-2
if ($.browser.msie) {
    $("#myCheckbox").click(function() { $(this).trigger('change'); });
}

$("#myCheckbox").change(function() {
        alert($(this).is(":checked"));
    });
user3239648
источник