我目前正在升级我的应用程序以使用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在将来的版本中继续以这种方式运行吗?
答案 0 :(得分:3)
最好的方法是:
$('#myelement').bind('initCheckboxes change', function() {
// do some stuff including ajax work
}).trigger('initCheckboxes');
要进行初始化工作,您只需将自定义事件绑定到该事件,然后在第一次加载页面时触发该事件。这个,没有人会在任何版本上带走你。
尽管我认为change
事件将继续存在于所有版本中,因为它已经存在了很长时间,并且它的工作方式很好。
最后,这是一个快乐的结局故事,因为自定义事件initCheckboxes
只会在页面加载时触发一次,change
事件将始终监听并触发更改状态。
答案 1 :(得分:2)
我想说这是jQuery 1.4.4中的一个错误。删除jQuery事件处理程序并使用标准addEventListener
产生与jquery 1.6.1相同的结果。
http://jsfiddle.net/jruddell/wDKPN/26/
window.count = 0;
document.getElementById('mycheckbox').addEventListener('change', function() {
window.count++;
jQuery('#output').append('I fired: ' + window.count + ' times<br />');
});
document.getElementById('mycheckbox').click();
我也会使用triggerHandler
来专门调用jQuery事件处理程序。如果您希望事件模型确定要调用哪些处理程序,请使用click
,change
等。
答案 2 :(得分:2)
忘记复选框的点击事件。更改事件处理所有事情。
$('#myelement').change(function() {
// do some stuff
});
$('#myelement').trigger('change');
亲眼看看:http://jsfiddle.net/zupa/UcwdT/ (此演示设置为jQuery 1.8,但也适用于1.6。)
答案 3 :(得分:1)
我认为你可以通过在单击处理程序中放置change()然后触发点击来使它适用于jQuery 1.4.4和1.6实现。
$('.myelement').click(function(){
$('.myelement').change();
alert($(this).val());
});
$('.myelement').trigger('click');
看看there的简单示例。