jquery - 在 jQuery 中,为什么以编程方式触发复选框上的 'click()' 不会立即检查它?

标签 jquery checkbox onclick

更新:这仅适用于 jQuery 1.8 及更低版本。这是fixed in jQuery 1.9 .

这是我的最小 jsfiddle 示例:http://jsfiddle.net/8fuEJ/ 。我正在使用 Google Chrome,如果这有什么不同的话。

我有一个复选框:

<input type="checkbox" id="wtf">

我有一个 jquery 事件处理程序:

$('#wtf').click(function(ev) { alert(this.checked); });

到目前为止,一切都很好。当我单击该复选框时,我首先看到出现复选标记,然后出现警报“true”(按此顺序)。当我再次单击它时,我看到复选标记消失,然后警报“假”。

当我以编程方式触发点击事件时,问题就出现了。像这样:

$('#wtf').click(function(ev) { alert(this.checked); });
$('#wtf').click();

在这种情况下,首先我看到警报“false”(复选标记仍然不可见),然后在消除警报后,复选标记出现。

为什么这里的顺序不同?

另请注意,如果我使用事件处理程序 change,它会按预期工作。

$('#wtf').change(function(ev) { alert(this.checked); });
$('#wtf').click();

在这里,我看到出现了复选标记,然后是警报“true”。

最佳答案

这里发生三种类型的操作:

  1. 手动单击它会更改状态。这就是它自己所做的一切;然后触发器会触发,因为它意识到它已被单击。这是脚本行为之前的浏览器行为问题。
  2. 调用 Click() 事件首先调用 JavaScript 事件。 jQuery 优先考虑您提供的功能,因为它很可能会取消该单击或执行其他一些操作。完成后,JavaScript 会更改复选框的状态。
  3. 最后,Change() 事件通过告诉浏览器单击来模仿手动单击。这意味着浏览器正在更改该项目,然后浏览器又调用您的触发事件。

本质上的区别在于 Click() 是直接的 javascript 调用。它可以做其他人做不到的事情,例如取消更改并做各种其他滑稽的事情,因此它会尽可能延迟状态更改。

关于jquery - 在 jQuery 中,为什么以编程方式触发复选框上的 'click()' 不会立即检查它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7678103/

相关文章:

javascript - 如果未选中包含一组复选框的框,则无法更新计数器

javascript - 侧边栏导航 - 单击侧边导航外部关闭侧边栏

javascript - 为什么 async : false inside a listener, 停止所有执行?

javascript - jQuery 使整个 Div 成为带有 _blank 的可点击链接

android - 单击后 onListItemClick 停止工作

javascript - 用纯 JavaScript 创建导航和页面

java - android:按钮onClick(),无法判断是否发生了任何事情

javascript - 在 .replaceWith() 之后恢复或保留 select 的事件

javascript - Angular js输入框如何在不改变的情况下传递ng-model呢?

javascript - 选中单选框输入时切换文本输入