在jQuery中,为什么以编程方式触发';单击();对一个复选框不立即检查吗?

在jQuery中,为什么以编程方式触发';单击();对一个复选框不立即检查吗?,jquery,checkbox,onclick,Jquery,Checkbox,Onclick,更新:这仅适用于jQuery 1.8及以下版本。这是我的 下面是我的最小JSFIDLE示例:。我正在使用谷歌浏览器,如果这有什么不同的话 我有一个复选框: <input type="checkbox" id="wtf"> 到目前为止,一切顺利。当我单击复选框时,我首先看到复选标记出现,然后是警报“true”(按该顺序)。当我再次单击它时,我看到复选标记消失,然后警告“false” 当我以编程方式触发click事件时,问题就出现了。像这样: $('#wtf').click(funct

更新:这仅适用于jQuery 1.8及以下版本。这是我的

下面是我的最小JSFIDLE示例:。我正在使用谷歌浏览器,如果这有什么不同的话

我有一个复选框:

<input type="checkbox" id="wtf">
到目前为止,一切顺利。当我单击复选框时,我首先看到复选标记出现,然后是警报“true”(按该顺序)。当我再次单击它时,我看到复选标记消失,然后警告“false”

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

$('#wtf').click(function(ev) { alert(this.checked); });
$('#wtf').click();
在本例中,首先我看到警报“false”(复选标记仍然不可见),然后在解除警报后,出现复选标记

为什么这里的顺序不同

还要注意,如果我使用事件处理程序
change
,它将按预期工作

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

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

单击事件在默认操作之前触发。它这样做是为了允许您通过从处理程序返回false来防止发生默认操作


在您的示例中,这意味着您警告旧值,因为更改复选框状态的默认操作尚未发生。

这里有三种类型的操作:

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

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

    …通过处理程序返回false或调用事件对象上的.preventDefault(),我知道默认操作和
    preventDefault
    ,但这并不能回答我的问题。我问了一下顺序上的区别。为什么单击它会先手动检查它,然后运行我的事件处理程序,而调用
    单击它则会先以编程方式调用我的事件处理程序,然后检查它?为了了解我的意思,如果我在事件处理程序中插入
    ev.preventDefault()
    ,在检查它时仍会发出“true”警报。在这种情况下,我会看到复选标记出现,然后警报“true”,然后复选标记消失。请参阅:换句话说,您说“在您的示例中,这意味着您警告旧值,因为更改复选框状态的默认操作尚未发生。”,这仅适用于编程情况。对于手动情况,我正在警告新值。为什么?
    $('#wtf').change(function(ev) { alert(this.checked); });
    $('#wtf').click();