在较新版本中使用.click()触发jQuery .change()事件?

时间:2011-06-14 20:06:29

标签: javascript jquery jquery-click-event

我目前正在升级我的应用程序以使用jQuery 1.6.1(以前使用1.4.4),并发现现在.click()事件也会自动触发.change()事件。

我在这里创建了一个简单的示例:http://jsfiddle.net/wDKPN/

请注意,如果您包含1.4.4,.change()功能会在触发.click()事件时触发。但是,当切换到1.6时,触发.change()时会触发.click()事件

两个问题:

  1. 这是一个错误吗?似乎以编程方式触发.click() 不应也会触发其他事件(例如,它似乎不对还会自动触发.blur().focus(),以帮助“模仿”用户的点击次数。)

  2. 我绑定change()事件然后触发两者 click()的正确方法是什么?该元素的change()事件?我是否只是致电.click(),并依赖于.change()也会触发的事实?

    $('#myelement').change(function() {
         // do some stuff
    });
    
    $('#myelement').click(); // both click and change will fire, yay!
    
  3. 在我的旧代码中,我正在使用此模式在ajax调用之后初始化一些复选框(及其检查的状态和值):

        $('#myelement').change(function() {
             // do some stuff including ajax work
        }).click().change();
    

    但是在1.6.1中,我的逻辑会触发两次(一次用于.click(),一次用于.change())。我可以依赖于删除.change()触发器并希望jQuery在将来的版本中继续以这种方式运行吗?

4 个答案:

答案 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事件处理程序。如果您希望事件模型确定要调用哪些处理程序,请使用clickchange等。

答案 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的简单示例。