jQuery单击()并更改选中的值

时间:2012-05-14 21:48:36

标签: javascript javascript-events jquery

看下面的jsfiddle:http://jsfiddle.net/RA3GS/4/

如果您手动选中复选框,则会看到他们在选中后会检查并检查这些复选框。但是,如果你按下测试按钮,你会发现他们要么已经检查过它们,然后取消选中,或者说它们没有被检查,并说它们已被检查。

问题在于:如果我选择不事先设置检查值,则会在最后正确选中复选框,但单击的功能会错误地指出它未被选中。如果我设置了选中的值,那么click()函数会正确地指出复选框已被选中,但是其他一些事件(联合国)有助于取消选中最后一个复选框。

jsfiddle是一个测试;在我的实际实现中,我将无法控制input元素上的click()函数,因此它不仅仅是在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为假。

2 个答案:

答案 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!

EDITED

ThiefMaster对第一条评论进行了改进。