jQuery 1.4.2 发布

发布于 作者

jQuery 1.4.2 现已发布!这是在 jQuery 1.4 基础上的第二次小版本发布,修复了 1.4 版本中的一些未解决的错误,并带来了一些不错的改进。

我谨感谢以下提供补丁的各位:Ben Alman、Justin Meyer、Neeraj Singh 和 Noah Sloan。

下载

像往常一样,我们提供两个版本的 jQuery,一个经过压缩(我们现在使用 Google Closure Compiler 作为默认压缩器),另一个未压缩(用于调试或阅读)。

您可以直接将以上 URL 包含到您的网站中,从而获得快速加载 jQuery 的全部性能优势。

此外,您还可以直接从 Google 或 Microsoft 的 CDN 加载 URL

新功能

完整的 API 变更列表可以在 jQuery API 网站的 1.4.2 分类中找到。

在这个版本中,我们添加了两个新方法:.delegate().undelegate()。这些方法是对现有 .live().die() 方法的补充。它们简化了在文档内的特定根元素上监听特定事件的过程。

例如

$("table").delegate("td", "hover", function(){
	$(this).toggleClass("hover");
});

这等效于使用 .live() 编写的以下代码

$("table").each(function(){
	$("td", this).live("hover", function(){
		$(this).toggleClass("hover");
	});
});

此外,.live() 大致等效于以下 .delegate() 代码。

$(document).delegate("td", "hover", function(){
	$(this).toggleClass("hover");
});

发生了哪些变化?

在这个版本中进行了一些大型代码重写,既为了提高性能,也为了修复长期存在的问题。

性能改进

与 jQuery 的几乎每个版本一样:我们努力不断改进代码的性能,确保为您提供最佳性能的 JavaScript 代码。

根据 Taskspeed 基准测试 提供的数字,与 jQuery 1.4.1 相比,jQuery 的性能提高了约 2 倍,与 jQuery 1.3.2 相比,提高了约 3 倍。

jQuery Taskspeed Results (Feb 14, 2010)

具体来说,我们改进了 jQuery 内部 4 个领域的性能

虽然像 Taskspeed 这样全面的基准测试如果分解成单个子测试以供进一步研究可能会很有趣,但作为项目,我们倾向于避免将其用作准确衡量库的整体性能的指标。考虑到构成库的许多方面,更不用说它们提供的不同技术了,累积结果很少能反映实际用户使用库的方式。

例如,我们仅仅通过优化 $("body") 选择器,在 Taskspeed 中看到了显著的整体性能提升,因为它在测试中被调用了数百次。此外,我们通过优化 .bind().unbind() 提高了毫秒级的一小部分——一个微不足道的量——特别是考虑到您要绑定数百个事件的情况,您可能更愿意使用 .live().delegate()

我们收集了一些 其他主要库的结果,但对这些结果不感兴趣,而更感兴趣的是我们相对于 jQuery 旧版本所做的性能改进。

我们将继续致力于优化 jQuery 代码库——无限期地。始终是我们关注的要点,努力为您提供最快的 JavaScript/DOM 开发体验。是的,可能总会有方法来获得额外的性能——无论是通过内部优化,还是通过将关键功能推送到浏览器端进行标准化。

事件重写

最大的内部变化来自于对事件模块进行急需的结构重写。这些修复解决了许多与事件绑定相关的奇怪问题。

具体来说,事件处理程序不再作为对象属性存储在 jQuery 的内部对象存储中(并附有附加到处理程序的元数据)。相反,它们现在存储在内部对象数组中。

如果您有机会使用 .data("events") 在 jQuery 元素上进行操作,您会发现它返回一个对象,其中包含当前绑定的所有事件类型。

为了列举在此重写期间发生的一些变化

  • 现在可以普遍使用不同的数据、命名空间和事件类型绑定相同的处理程序。
  • 事件处理程序的执行将在一个处理程序删除自身(或其兄弟处理程序)后继续。
  • 我们不再将数据/命名空间信息直接附加到事件处理程序(仅唯一跟踪 ID)。
  • 我们不再在内部使用代理函数来封装处理程序。
  • 事件的执行顺序现在在所有浏览器中都得到保证。Google Chrome 在其对象循环逻辑中存在一个长期错误,该错误已被绕过。

作为这些变化的副作用,我们不得不更改新公开的特殊添加/特殊删除 API,以便适应新的事件数据对象。Ben Alman 正在编写一个关于 jQuery 特殊事件系统的教程,我们将在发布时进行更多公告。

错误修复

这个小版本发布中总共关闭了 40 个工单。其中一些与 jQuery 1.3.2 和 jQuery 1.4.x 之间的差异有关,一些修复了长期存在的问题(例如事件模块重写)。

原始数据

这是我们收集的用于生成上述图表的数据。

	jQuery 1.3.2	jQuery 1.4.1	jQuery 1.4.2	Prototype 1.6.1	MooTools 1.2.4	Dojo 1.4.1	YUI 3.0.0
FF 3.5	2182	806	 565	 2156	 1073	 575	 1885
FF 3.6	1352	677	 519	 2067	 857	 750	 1494
Opera	983	697	 222	 793	 678	 218	 1201
Safari	610	435	 252	 315	 235	 238	 612
Chrome	1591	703	 293	 271	 312	 222	 745
IE 8	2470	1937	 1141	 3045	 4749	 1420	 2922
IE 7	4468	3470	 1705	 9863	 10034	 1737	 5830
IE 6	6517	4468	 2110	 13499	 11453	 2202	 7295