24

我目前正在升级我的应用程序以使用 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()触发其他事件(例如,自动触发and.focus()来帮助“模仿”用户的点击似乎是错误的)。

  2. 我绑定change()事件然后触发该元素的 a 和 event正确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 中,我的逻辑触发了两次(一次 for.click()和一次 for .change())。我可以仅仅依靠删除.change()触发器并希望 jQuery 在未来的版本中继续以这种方式运行吗?

4

4 回答 4

3

最好的方法是:

$('#myelement').bind('initCheckboxes change', function() {
     // do some stuff including ajax work
}).trigger('initCheckboxes');

要做你的初始化工作,你只需绑定一个自定义事件,在页面第一次加载时触发它。这一点,没有人会在任何版本上夺走你。

change我相信,事件将继续存在于所有版本中,因为它已经存在了很长时间,而且它以这种方式运行得很好。

最后,这是一个美好的结局,因为自定义事件initCheckboxes只会在页面加载时触发一次,并且change事件将始终侦听并在更改状态时触发。

于 2011-06-15T16:45:54.833 回答
3

我会说这是 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

于 2011-06-15T16:58:03.127 回答
2

忘记复选框的单击事件。change 事件处理一切。

$('#myelement').change(function() {
    // do some stuff
});
$('#myelement').trigger('change');

亲自查看:http: //jsfiddle.net/zupa/UcwdT/ (此演示设置为 jQuery 1.8,但也适用于 1.6。)

于 2012-12-18T17:12:46.007 回答
1

我认为您可以通过将 change() 放在单击处理程序中然后触发单击来使其适用于 jQuery 1.4.4 和 1.6 实现。

$('.myelement').click(function(){
 $('.myelement').change();   
 alert($(this).val());
});
$('.myelement').trigger('click');

看看那里的简单例子。

于 2011-06-14T23:44:48.310 回答