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 для чтения состояния.


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");
}
});

Несколько комментариев было бы неплохо
Данил Гапонов



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');
    }

});

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