需要复选框更改事件以响应以编程方式完成的已检查状态的更改

(jQuery 1.4.4)我有一个复选框,它有一个.change()监听器,当用户点击复选框时工作正常,但是现在我还需要它在我以编程方式更改jQuery中的复选框时触发,使用.attr( ‘已检查’,’已检查’)。 我非常乐意使用其他方法来完成这项工作。 谢谢。

$('#foo').attr('checked', 'checked'); // programmatically change the checkbox to checked, this checks the box alright $('#foo').change( function() { // this works when user checks the box but not when the above code runs } 

使用jquery click()更改复选框的状态而不是更改其属性。

没有你所有的标记我不确定这将是多么合适,但我最近使用这种方法效果很好。

如果你正在使用jQuery> 1.6,你可以通过定义一个attrHook巧妙地做到这attrHook

 jQuery.attrHooks.checked = { set: function (el, value) { if (el.checked !== value) { el.checked = value; $(el).trigger('change'); } } }; 

正如评论中指出的那样,如果新值与旧值相同,则if避免触发change事件。

…虽然你真的应该使用prop() ,所以它应该是;

 jQuery.propHooks.checked = { set: function (el, value) { if (el.checked !== value) { el.checked = value; $(el).trigger('change'); } } }; 

你可以看到这个在这里工作; http://jsfiddle.net/2nKPY/

对于jQuery <1.6(或者如果你不想添加propHook ),你可以做的最好是覆盖attr()方法(或升级:));

 (function () { var existingAttr = jQuery.fn.attr; jQuery.fn.attr = function (attr) { var result = existingAttr.apply(this, arguments); if (result instanceof jQuery && attr == "checked") { // If we're dealing with a check-set operation. result.trigger('change'); } return this; }; }()); 

你可以在这里看到这个

怎么样:

 $('some selector').trigger('click'); 

这只会在checked的值实际发生变化时触发。 在Matt的回答中,即使将相同的值分配给复选框,它也会触发。

 $.propHooks.checked = { set: function (el, value) { if (el.checked !== value) { trigger = true; } else { trigger = false; } el.checked = value; if (trigger) { $(el).trigger('change'); } } }; 

如果您有一个相对较新版本的JQuery,您可以使用.prop()函数以编程方式更改复选框:

 $(".myCheckbox").prop("checked", true); $(".myCheckbox").prop("checked", false); 

我正在开发一个基于复选框状态交换图像的插件,我也遇到了这个问题。

为了使问题复杂化,我正在使用的许多预先存在的代码( 解决 ?;))期望更改事件来自用户交互,因此当应该以编程方式检查复选框时触发click() / unchecked导致其他事件不应该触发(这些其他处理程序只应在用户更改值时运行)。

我解决的解决方案是将我的图像更新处理程序绑定到“更改”事件我称为“updateicon”的自定义事件。 然后,在propHooks.checked.set()中,我触发此“updateicon”事件。 这会导致图标更新程序以与用户单击输入时相同的方式更改图标,但不会导致先前绑定的更改/点击处理程序失败。

事件处理器绑定:

 input.on("change updateicon", toggleIconVisibility); 

物业变更钩子:

 jQuery.propHooks.checked = { set: function (el, value) { el.checked = value; $(el).trigger('updateicon'); } }; 

注意:在我最新的代码草案中,我运行$(el).filter(“。iconified”)。trigger(“updateicon”),以便仅触发由我“图标化”的元素上的“updateicon”插入