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

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(),以帮助“模

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

我在这里创建了一个简单的示例:

请注意,如果您包含1.4.4,则触发
.click()
事件时,
.change()
函数将不会触发。但是当切换到1.6时,当触发
.click()
时,将触发
.change()
事件

两个问题:

  • 这是一个bug吗?以编程方式触发
    .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中,我的逻辑触发了两次(一次用于
    。单击()
    ,一次用于
    。更改()
    )。我是否可以仅仅删除
    .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');