26

我正在尝试使用 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 事件被触发(并且值被正确获取)但之后复选框被取消选中。

谁能告诉我如何实现我想要做的事情?

4

6 回答 6

56

使用.triggerHandler()代替.trigger()

$('input[name=check1]').attr('checked', true).triggerHandler('click');

此外,使用.prop()代替.attr()

$('input[name=check1]').prop('checked', true).triggerHandler('click');

(如果您使用的是 jQuery 1.6 或更新版本。)编辑——另外,正如我在另一个答案中评论的那样,当以编程方式触发事件时,您必须注意 jQuery 的怪异行为。这是一个说明性的jsfiddle。 当元素上发生真正的“点击”时,该元素的“点击”处理程序将看到“已检查”标志的更新值。也就是说,如果您单击未选中的复选框,则单击处理程序将看到“已选中”标志设置为true. 但是,如果您通过 jQuery 在未选中的复选框上触发“单击”,“单击”处理程序将看到“选中”标志设置为false!在我看来,这是一件非常糟糕的事情,但它总是这样做。

再次编辑——哦,还有,我忘记了另一个重要的(也很烦人的)jQuery 怪事:由于未知的原因,.triggerHandler()API 只会在第一个匹配的元素上调用处理程序。如果您尝试触发所有复选框“单击”处理程序,换句话说:

$('input:checkbox').triggerHandler('click');

那么只会触发页面上的第一个复选框。为了处理这种精神错乱,我通常做的是将处理程序与我自己的假事件名称以及“点击”绑定:

$('input:checkbox').bind('click my-click', function() ... ) // or ".on()" with 1.7

这样我就可以触发“我的点击”并获得两全其美:库触发所有匹配元素的处理程序,但它不会切换元素的实际状态。

于 2012-04-22T13:15:05.200 回答
13

改变:

$('input[name=check1]').attr('checked', true).trigger('click');

至:

$('input[name=check1]').trigger('click').prop('checked', true);
于 2012-04-22T13:15:30.340 回答
3

这个答案似乎工作正常:

$('input[name=check1]').attr('checked', true).change();

jsFiddle 演示

于 2012-04-22T13:25:44.367 回答
0

.on('changed', ...)绝对是您应该在复选框元素上绑定的内容(它的行为更加合理。然后您可以手动触发.click()要切换状态的元素上的 a 以查看正确的事件触发发生(并查看匹配中的 DOM说明那些处理程序也看到的内容)。

<input type="checkbox" value="checked" name="check1">
<script>
    $('input').on('change', function(e) {alert(e.target.value);});
    $('input').click();
    // see the alert, and if you checked $(e.target).is(':checked') you should get true
</script>
于 2014-07-07T20:17:37.043 回答
0

点击选中..再次点击取消选中..
这是这个的逻辑

$('input[name=check1]').prop('checked',!$('input[name=check1]').prop('checked'));
于 2020-10-29T13:11:23.640 回答
0

只是其他帖子的插件,因为我无法发表评论。我发现我必须为道具使用字典。

IE

$('input[name=check1]').prop({'checked' : !$('input[name=check1]'}).prop('checked'));

于 2021-01-23T00:21:48.587 回答