看下面的jsfiddle:http://jsfiddle.net/RA3GS/4/
如果您手动选中复选框,则会看到他们在选中后会检查并检查这些复选框。但是,如果你按下测试按钮,你会发现他们要么已经检查过它们,然后取消选中,或者说它们没有被检查,并说它们已被检查。
问题在于:如果我选择不事先设置检查值,则会在最后正确选中复选框,但单击的功能会错误地指出它未被选中。如果我设置了选中的值,那么click()函数会正确地指出复选框已被选中,但是其他一些事件(联合国)有助于取消选中最后一个复选框。
jsfiddle是一个测试;在我的实际实现中,我将无法控制input元素上的click()函数,因此它不仅仅是在click函数中更改登录的问题。
这是我想要的行为,确切地说:
我在这里放了一个更简单的jsfiddle: http://jsfiddle.net/49jUL/
在不更改status
功能的情况下,无论您检查哪个复选框,我都希望控制台显示相同的内容。目前的输出是:
点击手册
A tester received the following event change
Value: 100 Checked: true
A tester received the following event click
Value: 100 Checked: true
点击控制器
A tester received the following event click
Value: 100 Checked: true
A tester received the following event change
Value: 100 Checked: false
我觉得有趣的是,如果我点击手动单选按钮,首先调用change
然后然后调用 click
,而如果我触发点击,{{1} }和然后 click
。
请注意,当我尝试将其称为change
时,它只会调用$target.change().click()
,然后调用change
,然后再次调用click
并设置change
为假。
答案 0 :(得分:3)
从我的评论 -
checked
字段是属性,而不是属性,因此我建议使用适当的访问者和mutator进行“已检查”状态:
$('#checkBoxElId').prop("checked");
和
$('#checkBoxElId').prop("checked", true/false);
或者,您可以将is()
函数与:checked
伪选择器一起使用,以查看是否已选中它:
$('#checkBoxElId').is(':checked');
初始加载复选框后,“checked”属性不会更改。有关复选框状态的详细信息,请参阅prop()
上的the jQuery documentation。
编辑:解决方案
在找到a bug report解释此行为后,我对错误评论中记录的变通方法进行了一些实验:使用triggerHandler("click")
而不是调用click()
。
click()
只是trigger("click")
的快捷方式,它将触发选择器找到的所有元素上的匹配事件,并且还将调用本机处理程序。 triggerHandler("click")
,OTOH,将仅触发选择器找到的第一个元素的事件,并将阻止发生默认(本机)行为。这是本机行为,正在弄乱复选框的“已检查”状态。通过避免它,你得到了理想的行为。
这是我的解决方案updated jsFiddle。
答案 1 :(得分:0)
您不能简单地触发复选框上的点击,您需要验证当前状态,然后采取相应措施:
$('#pushbutton').on("click", function() {
var $obj = $('#myCheckBoxID');
$obj.prop('checked', !$obj.prop('checked'));
alert('now check is: ' + $obj.prop('checked'));
});
请参阅此Fiddle Example!
ThiefMaster对第一条评论进行了改进。