2

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

试验和错误已经确定该演示停止使用 jQuery 版本 1.5.2 或更高版本。有趣的是,发行说明说 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 中,触发了 change事件

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

button clicked

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

button clicked
input checkbox change event

是否有任何文档来解释为什么会发生这种变化,以及我可以做些什么来解决它?该插件要求复选框更改事件不是由$(":checkbox").click().

4

2 回答 2

1

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

我刚刚与其中一位 jQuery 开发人员确认了这一点。他说:

我记得很清楚。如果调用它们,某些 DOM 方法最终应该会触发多个事件。这是旧 jQuery 不允许这样做的错误。就它是一个“突破性的变化”而言,嗯……对于很多人来说,它是一个“修复性的变化”。如果你依赖这个错误,那么是的,你的代码坏了。

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

希望能回答这个问题。

于 2013-04-19T16:12:13.710 回答
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(因为它不再是关键字,而只是一个字符串)。

现在事件绑定是 to foo,而不是change,调用 toclick()不会导致它在任何版本的 jQuery 中触发,并且我们trigger('foo')在需要触发时明确调用它。

于 2013-04-19T14:04:17.053 回答