jQuery,复选框和.is(“:checked”)


88

当我将函数绑定到复选框元素时,例如:

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

复选框在事件触发之前更改其选中属性,这是正常现象,并给出相反的结果。

但是,当我这样做时:

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

触发事件,复选框会更改其选中属性。

我的问题是,有没有办法像正常点击一样触发jQuery的click事件(第一种情况)?

PS:我已经尝试过了trigger('click')


5
我刚刚验证了这一点。你是完全正确的。那似乎确实是一个错误。我将其作为jQuery的错误提出,然后看看会发生什么dev.jquery.com
cletus 2010年

1
那“变更”事件呢?
ZippyV

@cletus确实,这是一个Jquery 1.4.2错误。1.3.2正常工作。

我在1.4.2和1.3.2中都看到了相同的行为:jsfiddle.net/HCUNn
Nick Craver

@Nick它的作用与普通鼠标单击相反。老实说,我不知道为什么1.3.2适用于我,而1.4.2无效,但是仍然需要更改。

Answers:


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

注意:在旧版本的jquery中,可以使用attr现在建议使用prop读取状态。


1
我已经尝试过,“ $(#myCheckbox).click()”取消选中/选中该框,但是更改功能从未触发过。我也尝试过更改'checked'属性,而不是调用click()甚至将'change'函数设置为'live'。

@Ben-您必须以其他方式触发它才能使其运行,请参阅我对trigger语句的回答。
尼克·克拉弗

@Nick谢谢,我将接受tcurdt的回答,因为他是第一个提出解决方案的人。愚蠢的我,我没有触发“更改”方法。

19
对于较新版本的jquery,该功能为prop(“ checked”)而不是attr(“ checked”),以防其他任何人被发现。
danski 2013年

由于不具有向后兼容性,我会避免使用“ prop”。在IE中。
vapcguy

27

在jQuery 1.3.21.4.2中有一种解决方法:

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

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

但我同意,与本地事件相比,此行为似乎有错误。


10

截至2016年6月(使用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 '17

4

我仍在使用jQuery 1.7.2遇到这种行为。一个简单的解决方法是使用setTimeout推迟单击处理程序的执行,并让浏览器同时执行以下操作:

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

是的 有点题外话,但是如果有人希望默认情况下它是“活动的”,那么当有人单击“添加新记录”时,我必须在Kendo网格中使用复选框进行同样的操作。我还必须给它500ms的时间。然后,我不得不添加.click(),然后设置.attr('value', 'true'),然后.change(),然后.blur()才将编程设置框当我点击“更新”按钮编程....
vapcguy

2

如果您预料到这种相当有害的行为,那么可以避免的是将jQuery.trigger()的额外参数传递给复选框的单击处理程序。这个额外的参数用于通知点击处理程序,该点击是通过编程方式触发的,而不是由用户直接单击复选框本身来触发的。然后,复选框的单击处理程序可以反转报告的检查状态。

因此,这就是在ID为“ myCheckBox”的复选框上触发点击事件的方式。请注意,我还传递了带有单个成员nonUI的对象参数,该成员参数设置为true:

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

这就是我在复选框的click事件处理程序中处理该事件的方式。处理程序功能将检查nonUI对象是否存在作为其第二个参数。(第一个参数始终是事件本身。)如果该参数存在并设置为true,那么我将反转报告的.checked状态。如果没有传入这样的参数-如果用户只是简单地单击UI中的复选框,就不会有此参数-然后我报告实际的.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);
    });

http://jsfiddle.net/BrownieBoy/h5mDZ/上的 JSFiddle版本

我已经测试过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");
}
});

一些评论会很好
Danil Gaponov

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

  if ($(this).prop('checked')){
    console.log('checked');
  }
});


0

好吧,为了匹配第一种情况,这是我想出的。

http://jsbin.com/uwupa/edit

本质上,您不是将“ click”事件绑定到警报中,而是将“ change”事件绑定到了警报中。

然后,当您触发事件时,首先触发点击,然后触发更改。


0

除了尼克·克雷弗(Nick Craver)的答案之外,要使其正常工作,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 2014年

似乎这只是一个重复的答案,change而不是使用OP click,并且只是使用一条if语句作为测试的另一种方式:checked
vapcguy 2015年

-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"));
    });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.