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 作为默认的压缩器)和一个未压缩版(用于调试或阅读)。
你可以随意将上面的 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 文档表格 中找到。所有测试都可以在 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 对象上使用 .data() 时,进行了一些更改(更准确地说,是对任何不是 DOM 节点的对象进行更改)。首先,无论何时在 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 文档表格 中找到。所有测试都可以在 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)
用于绑定一个除了返回 false 之外什么都不做的函数的便捷快捷方式(阻止默认操作并停止事件冒泡)。
.click(data, fn)
所有内置的事件方法(例如 .click())现在都接受数据作为第一个参数(类似于 bind 方法)。
event.namespace
事件对象的新的属性,它包含传递给 `jQuery.trigger()` 的事件命名空间。
效果
.show(speed, easing, callback) 等。
所有动画方法现在都支持缓动。就像 .animate() 支持缓动参数(用于缓动插件)一样
jQuery.fx.interval
一个新属性,它公开所有效果触发的速率(以毫秒为单位,默认值为 13)。使这个数字更小将在某些浏览器(如 Chrome)中使动画更流畅,但会消耗 CPU。
其他
jQuery.type
确定对象的内部 JavaScript [[Class]]。许多不同的方面被用来确定对象的准确返回值。逻辑可以如下确定
- 如果对象是未定义的或 null,那么将分别返回“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
一个用于确定对象是否可能是窗口的简单方法。
jQuery.isWindow(window); // true
此外,我们现在使用本机 Array.isArray 方法作为 jQuery 的 isArray(如果可用),并使用浏览器提供的本机 String trim 方法(同样,如果可用)。对 jQuery.trim 做了一些性能改进,详情见 以下线程。
测试
jQuery 1.4.3 在所有支持的浏览器上通过了 3621 个测试。我们在 Firefox 4 上 100% 通过,在 IE 9 上几乎通过(我们发现了两个错误,提交了它们,其中一个已经被修复)。