jQuery 1.4.3 发布

发布日期 作者

jQuery 1.4.3 现已发布!这是继 jQuery 1.4 之后的第三个次要版本,修复了一些 bug 并带来了一些不错的改进。

我要感谢以下社区成员为本次发布提供了补丁和意见: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 Core Style Guidelines 中记录了结果。

模块化

我们还删除了 jQuery 源代码中存在的许多模块间依赖关系。这样做可以提高使用源代码中 jQuery 副本时的灵活性。例如,您现在可以使用脚本加载器(例如 LABjsRequireJS)动态加载单个 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%。

jQuery 1.4.3 .css() Getting a Value

所有性能测试的原始数据可以在 以下 Google Doc 电子表格 中找到。所有测试都可以在 jQuery 源代码库 中找到。

数据

数据模块已经进行了一些改进,极大地提高了它的实用性。

HTML 5 data- 属性

首先,jQuery Metadata 插件提供的核心功能已迁移到核心库中。jQuery 将自动将 HTML 5 data- 属性 拉入 jQuery 的 data 对象中。

例如,给定以下 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- 属性在第一次访问 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 Data Linking 插件广泛使用。它使得 data API 能够同步设置 JavaScript 对象属性和表单字段。

其他

在 1.4.3 中,.data() 有一个小的 API 更改:调用 .data(Object) 不再完全替换 data 对象,而是扩展现有的对象,保留未指定的属性。我们发现,根据一些令人困惑的 bug 报告,这是预期结果。

遍历

几乎所有主要遍历方法的性能都得到了显著提高。.closest()、.filter()(以及 .is())和 .find() 都得到了极大的改进。

这些改进主要是由于更广泛地使用了浏览器的 querySelectorAll 和 matchesSelector 方法(如果存在)。jQuery 项目请求浏览器添加新的 matchesSelector 方法(编写测试套件、与供应商沟通并提交 bug),现在整个社区都将从中获益。

jQuery 1.4.3 .closest() Performance

jQuery 1.4.3 .filter() on a Single Element

jQuery 1.4.3 .find() on an element

所有性能测试的原始数据可以在 以下 Google Doc 电子表格 中找到。所有测试都可以在 jQuery 源代码库 中找到。

上述性能结果具体分析了 jQuery 代码中三个非常常见的用例:对单个 DOM 节点使用 .closest(),对单个 DOM 节点使用 .filter()(或 .is()),以及使用 .find() 以 DOM 元素为根(例如 $(“#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() 的事件命名空间。

效果

.show(speed, easing, callback) 等等

所有动画方法现在都支持缓动。就像 .animate() 支持缓动参数(供缓动插件使用)一样

jQuery.fx.interval

一个新属性,它公开所有效果触发的速率(以毫秒为单位——默认为 13)。将此数字调小将使某些浏览器(例如 Chrome)中的动画更流畅,但会消耗更多 CPU。

其他

jQuery.type

确定对象的内部 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

一个用于确定对象是否可能是窗口的简单方法。

jQuery.isWindow(window); // true

此外,我们现在使用原生 Array.isArray 方法来代替 jQuery 的 isArray(如果可用),并且我们使用浏览器提供的原生 String trim 方法(如果可用)。对 jQuery.trim 进行了一些性能改进,详情请参见 以下线程

测试

jQuery 1.4.3: Passing 3621 Tests in All Browsers

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

55 thoughts on “jQuery 1.4.3 Released

  1. 我对这句话感到困惑(在“事件”下)

    “jQuery 已经有了 setData 和 getData 事件(当通过 .data() 方法设置或获取数据时广播) - 重写这些方法可以覆盖这些功能的默认行为(即您可以返回不同的值或阻止设置值。”

    1. “(…) 已经有了 setData 和 getData 事件 (…) - 重写这些方法” - 哪些方法?!

    2. “可以覆盖默认行为” - 如何?!我已经查看了源代码,但我想不出任何方法可以“返回不同的值”或“阻止设置值”。

    有谁比我更了解吗?

  2. Dale Larsen on said:

    在 IE 中更改滑块的值不再有效。它在 1.4.2 中有效,但在 1.4.3 中无效。我使用的是 jQuery UI 1.8。

    $sliderBar5.slider(‘value’, parseInt(cacheBorderArea.attr(‘cornerSize’)));

    这是 IE8 给我的错误

    Invalid argument. jquery-latest.js?d=276880459, line 155 character 295

  3. 我在 IE8 中也遇到了同样的“无效参数”错误。我使用了一个滑块,并确认当设置值时会造成此错误。

  4. 我能够通过使用选项设置值来解决此错误。

    $slider.slider(‘option’, ‘value’, someValue);

    希望这有帮助!

  5. Igor Plaksiy on said:

    我刚在我的某些使用 1.4.2 的页面上注意到这一点。

    我有一些页面使用 $(location).attr(“href”) 来获取查询字符串。更新到 1.4.3 后,此功能消失了。没有错误,什么都没有,如果将其设置为变量,则警报返回为“未定义”。暂时切换到 parent.document.URL 已解决问题,但想知道 1.4.4 是否会再次允许使用 $(location).attr(“href”)。

    谢谢!