在jQuery中,为什么以编程方式触发复选框上的“click()”而不是立即检查它?
更新:这仅适用于jQuery 1.8及更低版本。 这是在jQuery 1.9中修复的 。
这是我的最小jsfiddle示例: http : //jsfiddle.net/8fuEJ/ 。 我正在使用谷歌浏览器,如果这有所作为。
我有一个复选框:
我有一个jquery事件处理程序:
$('#wtf').click(function(ev) { alert(this.checked); });
到现在为止还挺好。 当我单击复选框时,我首先看到复选标记出现,然后是警告“true”(按此顺序)。 当我再次点击它时,我看到复选标记消失,然后警告“false”。
当我以编程方式触发click事件时出现问题。 像这样:
$('#wtf').click(function(ev) { alert(this.checked); }); $('#wtf').click();
在这种情况下,首先我看到警告“false”(复选标记仍然不可见), 然后在解除警报后,会出现复选标记。
为什么这里的顺序不同?
另请注意,如果我使用事件处理程序change
,它将按预期工作。
$('#wtf').change(function(ev) { alert(this.checked); }); $('#wtf').click();
在这里,我看到复选标记出现,然后是警告“true”。
这里有三种类型的操作:
- 手动单击它会更改状态。 这就是它本身所做的一切; 触发器然后触发,因为它意识到它已被点击。 这是脚本行为之前的浏览器行为问题。
- 调用
Click()
事件首先调用javascript事件。 jQuery优先考虑您提供的function,因为它可以很好地取消该单击或执行其他操作。 完成后,javascript会更改复选框的状态。 - 最后,
Change()
事件通过告诉浏览器单击它来模仿手动单击。 这意味着浏览器正在更改项目,然后浏览器会调用您触发的事件。
本质上,区别在于Click()
是一个直接的javascript调用。 它可以做其他人不能做的事情,比如取消改变和做各种其他的东西,所以只要它可以延迟状态的改变。
click事件在默认操作之前触发。 这样做是为了通过从处理程序返回false来防止发生默认操作。
在您的示例中,这意味着您警告旧值,因为尚未发生更改复选框状态的默认操作。