【发布时间】:2011-06-14 20:06:28
【问题描述】:
我目前正在升级我的应用程序以使用 jQuery 1.6.1(以前使用 1.4.4)并发现现在 .click() 事件也会自动触发 .change() 事件。
我在这里创建了一个简单的例子:http://jsfiddle.net/wDKPN/
请注意,如果您包含 1.4.4,.change() 函数将在触发 .click() 事件时不会触发。但是当切换到 1.6 时,.change() 事件会在.click() 被触发时触发。
两个问题:
这是一个错误吗?似乎以编程方式触发
.click()不应该也触发其他事件(例如,似乎也错误自动触发.blur()和.focus(),以帮助“模仿”用户的点击)。-
我绑定
change()事件的正确方法是什么然后触发两个该元素的click()和change()事件?我是否只是调用.click(),并依赖.change()也会触发这一事实?$('#myelement').change(function() { // do some stuff }); $('#myelement').click(); // both click and change will fire, yay!
在我的旧代码中,我使用这种模式在 ajax 调用后初始化一些复选框(以及它们的选中状态和值):
$('#myelement').change(function() {
// do some stuff including ajax work
}).click().change();
但在 1.6.1 中,我的逻辑触发了两次(一次用于.click(),一次用于.change())。我是否可以仅依靠删除 .change() 触发器并希望 jQuery 在未来版本中继续以这种方式运行?
【问题讨论】:
-
尽管这是一个非常好的观察结果,但我将其称为“修复”而不是“错误”。单击复选框使其更改状态,因此它完全有理由触发更改事件。对我来说,奇怪的是它以前没有这样做(并且有a thread on SO)。
-
当然,我想我可以同意这是故意的,可能不是错误。我希望它在升级时保持这种状态......我们不能为其他事件争论吗?例如,我们是否可以将其改写为“如果用户单击一个复选框,他们必须也已更改它”。我们也可以说,“如果用户点击一个复选框,它必须获得焦点”。但是 .focus() 事件不会像 .change() 那样通过 .click() 自动触发。
-
有趣的事实,你有没有在 IE(6?)上做了一些测试,因为我记得复选框/jQuery 和事件链的一些奇怪行为?您是否也检查了 triggerHandler('click'),因为文档说“.triggerHandler() 方法不会导致事件的默认行为发生(例如表单提交)”,所以这是否会使链接现在改跑吗?
-
@regilero,我刚刚在 IE7/8/9 中测试过(我现在不关心 6),更糟糕的是,IE7/8 不要使用 jQuery 1.6.1 自动触发 .change() 事件。 IE9 的行为类似于 FF4 / Chrome12 / Safari。因此,至少我们与较低版本的 IE 存在不一致。
-
我们只是在谈论复选框,对吗?如果您希望单击触发事件,则 SELECT 列表似乎需要绑定到“单击”和“更改”
标签: javascript jquery jquery-click-event