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 API 文档 1.4.3 版 中找到。
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 数据属性
首先,jQuery Metadata 插件提供的主要功能已移动到核心。 HTML 5 数据属性 将自动提取到 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)。
数据属性在第一次访问数据属性时被提取,然后不再访问或修改(所有数据值随后都存储在 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 Data Linking 插件广泛使用。它使得数据 API 能够将 JavaScript 对象属性的设置与表单字段同步。
其他
在 1.4.3 中,.data(Object) 的 API 有一个小的更改:调用 .data(Object) 不会完全替换数据对象,而是扩展现有对象,保留未指定的数值。我们发现这是基于许多混淆的错误报告的预期结果。
Traversing
几乎所有主要遍历方法的性能都得到了显著提高。 .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
事件对象的一个新属性,包含传递到 .trigger() 的事件命名空间。
Effects
.show(speed, easing, callback), 等
所有动画方法现在都支持 easing。就像 .animate() 支持 easing 参数(由 easing 插件使用)一样
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
一种简单的确定对象是否可能是 window 的方法。
jQuery.isWindow(window); // true
此外,我们现在使用原生的 Array.isArray 方法来处理 jQuery 的 isArray(如果可用),并且我们利用浏览器提供的原生 String trim 方法(同样,如果可用)。jQuery.trim 进行了许多性能改进,详情请参见 以下主题。
测试
jQuery 1.4.3 在所有受支持的浏览器上通过了 3621 个测试。我们在 Firefox 4 上 100% 通过,并且在 IE 9 上几乎通过(我们发现了两个错误,提交了它们,其中一个已经修复)。