我正在尝试使用jQuery选中一个复选框,并在流程中触发onclick事件。
假设我在html中定义了一个复选框:
<input type="checkbox" value="checked" name="check1" onclick="alert(this.value);">
我有一个在函数中触发的jQuery语句:
$('input[name=check1]').attr('checked', true);
结果是复选框被选中,但是javascript onclick事件没有被触发(因此没有警报)。但如果我手动触发点击:
$('input[name=check1]').attr('checked', true).trigger('click');
结果是复选框被选中,javascript onclick事件被触发(并且值被正确获取),但在那之后复选框被取消选中。
有人能告诉我怎样才能实现我想要做的事吗?
发布于 2012-04-22 21:15:05
使用.triggerHandler()
而不是.trigger()
$('input[name=check1]').attr('checked', true).triggerHandler('click');
此外,请使用.prop()
而不是.attr()
$('input[name=check1]').prop('checked', true).triggerHandler('click');
(如果您使用的是jQuery 1.6或更新版本。)编辑-此外,正如我在另一个答案中所评论的那样,当以编程方式触发事件时,您必须注意jQuery的奇怪行为。Here is an illustrative jsfiddle.当真正的“单击”发生在一个元素上时,该元素的“单击”处理程序将看到"checked“标志的更新值。也就是说,如果您单击一个未选中的复选框,单击处理程序将看到"checked“标志设置为true
。但是,如果您通过jQuery在未选中的复选框上触发“单击”,“单击”处理程序将看到“选中”标志设置为false
!在我看来,这是一件非常糟糕的事情,但它总是这样做的。
再次编辑-哦,还有,我忘记了另一个重要的(也是令人恼火的) jQuery的奇怪之处:由于未知的原因,.triggerHandler()
应用程序接口将只在第一个匹配的元素上调用处理程序。如果您尝试触发所有复选框“单击”处理程序,换句话说:
$('input:checkbox').triggerHandler('click');
则只会触发页面上的第一个复选框。我通常会用我自己的假事件名和“click”来绑定处理程序:
$('input:checkbox').bind('click my-click', function() ... ) // or ".on()" with 1.7
这样我就可以触发"my-click“,两全其美:库在所有匹配的元素上触发处理程序,但它不会切换元素的实际状态。
发布于 2012-04-22 21:15:30
更改:
$('input[name=check1]').attr('checked', true).trigger('click');
至:
$('input[name=check1]').trigger('click').prop('checked', true);
发布于 2012-04-22 21:25:44
https://stackoverflow.com/questions/10268222
复制相似问题