Javascript jQuery.change()事件是在较新版本中使用.click()触发的吗?
我目前正在将我的应用程序升级为使用jQuery 1.6.1(以前使用的是1.4.4),发现现在Javascript jQuery.change()事件是在较新版本中使用.click()触发的吗?,javascript,jquery,jquery-click-event,Javascript,Jquery,Jquery Click Event,我目前正在将我的应用程序升级为使用jQuery 1.6.1(以前使用的是1.4.4),发现现在.click()事件也会自动触发.change()事件 我在这里创建了一个简单的示例: 请注意,如果您包含1.4.4,则触发.click()事件时,.change()函数将不会触发。但是当切换到1.6时,当触发.click()时,将触发.change()事件 两个问题: 这是一个bug吗?以编程方式触发.click()似乎不应该同时触发其他事件(例如,自动触发.blur()和.focus(),以帮助“模
.click()
事件也会自动触发.change()
事件
我在这里创建了一个简单的示例:
请注意,如果您包含1.4.4,则触发.click()
事件时,.change()
函数将不会触发。但是当切换到1.6时,当触发.click()
时,将触发.change()
事件
两个问题:
.click()
似乎不应该同时触发其他事件(例如,自动触发.blur()
和.focus()
,以帮助“模拟”用户的单击,这似乎是错误的)change()
事件,然后触发该元素的click()
和change()
事件的正确方法是什么?我是否只调用.click()
,并依赖于.change()
也会触发这一事实
$('#myelement').change(function() {
// do some stuff
});
$('#myelement').click(); // both click and change will fire, yay!
$('#myelement').change(function() {
// do some stuff including ajax work
}).click().change();
但在1.6.1中,我的逻辑触发了两次(一次用于
。单击()
,一次用于。更改()
)。我是否可以仅仅删除.change()
触发器,并希望jQuery在未来的版本中继续以这种方式运行?我认为您可以通过将change()放在click处理程序中,然后触发click,使它在jQuery 1.4.4和1.6实现中都能工作
$('.myelement').click(function(){
$('.myelement').change();
alert($(this).val());
});
$('.myelement').trigger('click');
看看简单的例子。最好的方法是:
$('#myelement').bind('initCheckboxes change', function() {
// do some stuff including ajax work
}).trigger('initCheckboxes');
要进行初始化,只需将自定义事件绑定到它,在页面第一次加载时触发它。这一点,没有人会从你的任何版本
然而,我相信,change
event将继续出现在所有版本中,因为它已经存在了很长时间,并且以这种方式工作得很好
最后,这是一个圆满的结局,因为定制事件
initcheckbox
在页面加载时只会触发一次,而change
事件将始终侦听并在更改状态时触发。我认为这是jQuery 1.4.4中的一个错误。删除jQuery事件处理程序并使用标准的addEventListener
生成与jQuery 1.6.1相同的结果
window.count=0;
document.getElementById('mycheckbox')。addEventListener('change',function(){
window.count++;
jQuery('#output').append('I fired:'+window.count+'次
');
});
document.getElementById('mycheckbox')。单击();
我还将使用
triggerHandler
专门调用jQuery事件处理程序。如果希望事件模型确定要调用哪些处理程序,请使用单击
,更改
等。忽略单击事件复选框。更改事件处理所有事情
$('#myelement').change(function() {
// do some stuff
});
$('#myelement').trigger('change');
你自己看看:
(此演示设置为jQuery 1.8,但也适用于1.6。)尽管这是一个非常好的观察结果,但我认为它更像是一个“修复”,而不是一个“bug”。单击该复选框将使其更改状态,因此有一个完全有效的理由使其触发更改事件。对我来说,奇怪的是,它以前没有这样做过(就这一点而言,确实有)。当然,我认为我可以同意这是故意的,可能不是一个bug。我希望升级时保持这种状态。。。那么我们就不能为其他事件争论吗?例如,我们可以将其重新表述为“如果用户单击复选框,他们也必须更改它”。我们是否也可以说,“如果用户单击复选框,它必须已收到焦点”。但是.focus()事件不会像.change()那样通过.click()自动触发。有趣的事实是,yopu是否在IE(6?)上进行了一些测试,因为我还记得一些使用复选框/jQuery和事件链的奇怪行为?您是否也检查了triggerHandler('click'),正如文档所说的那样,.triggerHandler()方法不会导致事件的默认行为发生(例如表单提交)”,那么这是否会使链接更改立即运行?@regilero,我刚刚在IE7/8/9中测试过(我现在不关心6),更糟糕的是,IE7/8不会使用jQuery 1.6.1自动触发.change()事件。IE9的行为类似于FF4/Chrome12/Safari。因此,至少我们与IE的较低版本存在不一致之处。我们只是在这里讨论复选框,对吗?选择列表似乎需要绑定到“单击”和“更改”,如果您希望单击触发事件,这可能适用于我介绍的简单用例。。。但是绑定到.change()事件的目的是,当在.click()事件和.change()事件中时,复选框本身的状态不同。我在这里创建了另一个示例:(注意,在单击事件中,通过编程调用复选框时,复选框的实际状态尚未更新,在我的例子中,我使用ajax调用在初始化时动态确定复选框的选中状态)。这将无休止地附加
更改事件。@Shef-正确,我刚刚注意到在我的沙盒测试中:)太棒了。我对代码的理解太深了,无法从全局考虑问题。这也解决了IE7/8与其他所有IE7/8行为不同的问题。而且它可以升级(因此,如果他们决定从.click()自动停止调用.change(),这并不重要。最后,在我的HTML中,我将使用checked=“checked”创建我的复选框,这样在初始化时它们将被视为“checked”(这解决了我在下面对@kwicher的注释中的其他要求).谢谢!triggerHandler在大多数情况下可能更好?vs。
$('#myelement').change(function() {
// do some stuff
});
$('#myelement').trigger('change');