jQuery 1.5.2中没有记载的重大变化

时间:2013-04-19 13:07:05

标签: jquery

我正在尝试使用jQuery插件CheckTree来实现可选项的树。演示页面(上面的链接)带来了jQuery 1.2.6 ...正如您所料,我的网站有更新的东西。

试验和错误已经确定该演示停止使用jQuery版本1.5.2或更高版本。有趣的是,release notes说jQuery 1.5.2只是一个错误修正版本,并没有引入任何重大变化。我把这个问题简化为最简单的形式:

<!DOCTYPE html>
<html lang="en-gb">
    <head>
        <meta charset="utf-8">
        <title>Breaking change in jQuery 1.5.2?</title>
    </head>
    <body>
        <input type="checkbox">
        <button>Click me</button>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.js"></script>
        <script>
            $(function(){
                $(':checkbox').change(function(){ console.log('input checkbox change event'); });
                $("button").click(function(){
                    console.log('button clicked');
                    $(":checkbox").click();
                });
            });
        </script>
    </body>
</html>

在jQuery 1.5.1中,单击按钮时不会触发复选框的更改事件。在jQuery 1.5.2中,更改事件触发。

换句话说,当使用jQuery 1.5.1时,单击该按钮会产生以下控制台输出:

button clicked

使用jQuery 1.5.2时,单击按钮时会记录以下内容:

button clicked
input checkbox change event

是否有任何文档可以解释为什么会发生这种变化,以及我可以采取哪些措施来解决这个问题?该插件要求$(":checkbox").click()不会触发复选框更改事件。

2 个答案:

答案 0 :(得分:1)

我怀疑这更像是一个错误,而不是破坏功能。换句话说,CheckTree插件依赖于jQuery错误,因此在修复bug时插件就崩溃了。

我刚刚与其中一个jQuery开发人员证实了这一点。他说:

  

我记得那一口井。如果调用它们,某些DOM方法应该最终触发多个事件。这是一个旧的jQuery不允许这样的错误。至于它是一个“突破性的变化”,那么......很多人都在“修改”。如果你依赖于这个bug,那么你的代码就破了。

以下是来自github的相关拉取请求:https://github.com/jquery/jquery/pull/260

希望回答这个问题。

答案 1 :(得分:0)

我已经实现了一个解决方案,但我仍然希望看到改变行为的文档以了解正在发生的事情!

解决方法依赖于以下事实:上述JavaScript可以重写为:

$(function(){
    $(':checkbox').bind('change',function(){ console.log('input checkbox change event'); });
    $("button").click(function(){
        console.log('button clicked');
        $(":checkbox").click();
    });
});

即。我已将change(fn)替换为bind('change',fn)。插件中有两个位置在复选框上明确调用change(),因此可以将它们重写为trigger('change')

拼图的最后一部分是将change事件重命名为其他内容,例如foo(因为它不再是关键字而只是一个字符串)。

既然事件绑定是foo而不是change,对click()的调用不会导致它在任何版本的jQuery中触发,我们会使用它来表示它trigger('foo')当我们需要它时。{/ p>