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