jQuery 1.4.3 现已发布! 这是基于 jQuery 1.4 的第三个次要版本,修复了一些错误并带来了一些不错的改进。
我要感谢以下社区成员,他们为该版本提供了补丁和意见: Anton M.、Justin Meyer、Colin Snover、Ryan Tenney、Louis-Rémi Babé、David Petersen、Rick Waldron、Dave Reed、John-David Dalton、temp01、Heungsub Lee、J. Ryan Stinnett、Robert Katic、Juriy Zaytsev、James Burke、Jeffery To、Carl Fürstenberg、Jacob Wright、Jeff Robinson、Christian C. Salvadó、Andrée Hasson、Jason Webster、Dave Furfero、Adam Sontag、Travis Hardiman、DBJDBJ 和 Ben Alman。
以及以下 jQuery 团队成员:Scott González、Brandon Aaron、Yehuda Katz、Dave Methvin、Karl Swedberg、Paul Irish、Ralph Whitbeck、Jörn Zaefferer、Richard Worth、Doug Neiner 和 Mike Alsup。
下载
与往常一样,我们提供两个版本的 jQuery,一个压缩版本(我们现在使用 Google Closure Compiler 作为默认的压缩器)和一个未压缩版本(用于调试或阅读)。
- jQuery 压缩版 (26kb Gzipped)
- jQuery 普通版 (179kb)
您可以随意将上述 URL 直接包含到您的网站中,并将获得快速加载的 jQuery 所带来的全部性能优势。
此外,您还可以直接从 Google 的 CDN 加载 URL
一般改进
我们在 jQuery 的内部和我们用于开发的指南方面做了一些改进。
JSLint
首先,jQuery 现在通过了 Douglas Crockford 的 JSLint 工具。 我们已将他的工具集成到我们的工作流程中(从 Github 中检出 jQuery 并运行“make lint” 将显示结果) - 使我们能够掌握可能的回归。
我们对 JSLint 做了一些细微的更改以适应我们的特定开发风格,并在 jQuery 核心风格指南 中记录了结果。
模块化
我们还删除了 jQuery 源代码中存在的许多模块间依赖关系。 这样做可以提高使用源代码副本的 jQuery 时带来的灵活性。 例如,您现在可以使用脚本加载器(如 LABjs 或 RequireJS)来动态加载各个 jQuery 模块(例如,核心、支持、数据和事件)。
此外,此更改使您不再需要构建 jQuery 的副本才能运行 jQuery 测试套件。 这极大地改善了我们的开发工作流程 - 使我们能够快速更改 jQuery 并测试结果,而无需(相对)缓慢的构建步骤。
新功能
所有新功能和更改可以在 jQuery 1.4.3 的 API 文档 中找到。
CSS 模块重写
几乎整个 CSS 模块都已重写,完全专注于可扩展性。 您现在可以编写自定义 CSS 插件,这些插件扩展了由 .css() 和 .animate() 提供的功能。
例如,这是由 Louis-Rémi Babé 编写的利用新功能的插件:jQuery Rotate。
该插件提供了一种跨浏览器的方式来设置和动画 DOM 元素的旋转,只需使用传统的 jQuery 方法,如下所示
$('#myDiv').css('rotate', 90); $('#myDiv').animate({rotate: 180});
在重写过程中,我们将包含在 jQuery 中的功能分解为两个非常清晰的路径:获取和设置元素的 .style 属性(通过 jQuery.style 完成)以及获取元素的当前计算样式信息(通过 .css() 和 jQuery.css 完成 - 请注意,jQuery.curCSS 不再使用,并且已弃用)。 .css() 提供的功能同时使用 jQuery.style 和 jQuery.css 方法。
进行此更改使计算样式检索的速度有所提高,也产生了高达 20% 的速度提升。

所有性能测试的原始数据可以在 以下 Google Doc 电子表格 中找到。 所有测试都可以在 jQuery 源代码存储库 中找到。
数据
数据模块已进行了一些改进,大大提高了其效用。
HTML 5 data- 属性
首先,jQuery Metadata 插件提供的主要功能已移入核心。 HTML 5 data- 属性 将自动被拉入 jQuery 的数据对象中。
例如,给定以下 HTML
<div data-role="page" data-hidden="true" data-options='{"name":"John"}'></div>
以下所有 jQuery 代码都将起作用。
$("div").data("role") === "page"; $("div").data("hidden") === true; $("div").data("options").name === "John";
请注意,字符串保持不变,而 JavaScript 值将转换为其关联值(包括布尔值、数字、对象、数组和 null)。
data- 属性在第一次访问数据属性时被拉入,之后不再访问或修改(所有数据值随后在 jQuery 中内部存储)。
JavaScript 对象
对 JavaScript 对象(或更准确地说,任何不是 DOM 节点的对象)使用 .data() 时,进行了一些更改。 首先,每当您在 JavaScript 对象上设置数据时,数据都会直接在对象上设置 - 而不是进入内部数据对象存储。 此外,附加到对象的事件被放置在一个新的“__events__”属性中,该属性实际上是一个函数。 这样做是为了允许事件直接附加到对象,并在收集对象时被垃圾回收,并且不会被 JSON 序列化器序列化。 这些更改应该使 jQuery 的数据和事件系统在 JavaScript 对象上更加有用。
活动
jQuery 已经有了 setData 和 getData 事件(在通过 .data() 方法设置或获取数据时广播这些事件) - 重写这些方法可以覆盖这些功能的默认行为(也就是说,您可以返回不同的值或阻止设置值。 请注意,在 jQuery 1.4.3 中,这些事件不再冒泡(允许它们冒泡在大多数应用程序中被证明过于昂贵)。
在 1.4.3 中,我们引入了一个名为 changeData 的新事件。 当使用 .data() 更改任何单个数据属性时,将触发此事件。 例如
var user = new User(); $(user).bind("changeData", function( event, name, value ) { $("#user").find("#" + name).val( value ); });
changeData 事件被新的 jQuery 数据链接 插件广泛使用。 它使数据 API 能够同步设置 JavaScript 对象属性和表单字段。
其他
在 1.4.3 中,对 .data() 进行了一个小 API 更改:调用 .data(Object) 不再完全替换数据对象,而是扩展现有对象,并将未指定的值保留在原处。 我们发现,根据许多令人困惑的错误报告,这是预期的结果。
遍历
几乎所有主要遍历方法的性能都得到了显著提高。 .closest()、.filter()(以及因此,.is())和 .find() 都得到了极大的改进。
这些改进很大程度上是由于更多地使用了浏览器的 querySelectorAll 和 matchesSelector 方法(如果存在)。 jQuery 项目要求浏览器添加新的 matchesSelector 方法(编写测试套件、与供应商交谈并提交错误),整个社区现在都能享受到出色的性能优势。

所有性能测试的原始数据可以在 以下 Google Doc 电子表格 中找到。 所有测试都可以在 jQuery 源代码存储库 中找到。
上述性能结果专门针对 jQuery 代码中的三个非常常见的情况:在单个 DOM 节点上使用 .closest(),在单个 DOM 节点上使用 .filter()(或 .is()),以及在 DOM 元素上使用 .find()(例如,$(“#test”).find(“something”))。
请注意,显示的浏览器是实际支持 querySelectorAll 或 matchesSelector 的浏览器 - 不支持这些方法的现有浏览器将继续具有相同的性能特征。
Ajax
已经发布了一些新的 Ajax 功能,这些功能应该可以帮助插件作者和构建渐进增强型应用程序的人员。
引入了一个新的 jQuery.readyWait 属性,当添加时,该属性会延迟 ready 事件的执行。 这应该由希望延迟 ready 事件发生到指定时间的插件使用。 例如,RequireJS 已经实现了对该属性的使用,允许您加载在 ready 事件触发之前应该处理的依赖项。 每当某个项目完成加载时,您最终应该调用 jQuery.ready(true)
(如果所有依赖项都已完成加载 - 并且 DOM 已准备就绪 - 那么 ready 事件将触发)。
我们还添加了一个新的支持属性:jQuery.support.ajax。 简而言之,它在能够处理“Ajax”(XMLHttpRequest)请求的浏览器中返回 true。
活动
.bind(“click”, false) 和 .unbind(“click”, false)
绑定一个什么也不做的函数(阻止默认操作并停止事件冒泡)的便捷快捷方式。
.click(data, fn)
所有内置的事件方法(如 .click())现在都接受数据作为初始参数(就像 bind 方法一样)。
事件对象的属性,包含传递给 .trigger()
的事件命名空间。
效果
.show(speed, easing, callback) 等。
所有动画方法现在都支持缓动。 就像 .animate() 如何支持缓动参数(供缓动插件使用)一样
公开所有效果触发速率(以毫秒为单位 - 默认值为 13)的新属性。 使此数字更小将使一些浏览器(如 Chrome)中的动画更平滑,但代价是 CPU 占用率更高。
其他
确定对象的内部 JavaScript [[Class]]。 使用许多不同的方面来确定对象的精确返回值。 逻辑可以确定如下
- 如果对象未定义或为空,则分别返回“undefined”或“null”。
- 如果对象具有等效于浏览器的内置对象的内部 [[Class]],则返回关联的名称。 (有关此技术的更多详细信息。)
- jQuery.type(true) === “boolean”
- jQuery.type(3) === “number”
- jQuery.type(“test”) === “string”
- jQuery.type(function(){}) === “function”
- jQuery.type([]) === “array”
- jQuery.type(new Date()) === “date”
- jQuery.type(/test/) === “regexp”
- 所有其他内容将返回“object”作为其类型。
用于确定对象是否可能是窗口的简单方法。
jQuery.isWindow(window); // true
此外,我们现在使用本机 Array.isArray 方法来进行 jQuery 的 isArray(如果可用),并且我们使用浏览器提供的本机 String trim 方法(同样,如果可用)。 对 jQuery.trim 做了一些性能改进,详见 以下主题。
测试

jQuery 1.4.3 在所有支持的浏览器上通过了 3621 个测试。我们在 Firefox 4 上 100% 通过,并且在 IE 9 上几乎通过(我们发现了两个错误,提交了报告,其中一个已经修复了)。