我正在尝试使用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()
不会触发复选框更改事件。
答案 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>