jQuery 团队很高兴发布 jQuery JavaScript 库的最新主要版本!这次发布投入了大量的编码、测试和文档编写工作,我们对此感到非常自豪。
我个人要感谢 Ariel Flesler 和 Brandon Aaron,他们投入了大量精力修复错误并促成这次发布。
概述
jQuery 1.3 包含许多重大更改,以下是一些最大和最突出的更改。
Sizzle 选择器引擎
jQuery 有了一个全新的 CSS 选择器引擎——昵称为 Sizzle。我们希望拥有一个引擎,它
- 比我们当前引擎更快,适用于最常用的选择器。
- 完全可扩展(我们不得不牺牲一些可扩展性以换取性能,在 jQuery 的过去版本中)。
- 完全独立。
就性能而言,我们做得相当不错,比我们之前的引擎快约 49%。

考虑到 1.2.6 中的引擎已经非常快,并且我们在此过程中获得了大量的可扩展性,这尤其令人惊讶。
在开发新引擎期间,有一件事变得非常明显:我们希望能够与其他库和开发人员合作。我们看到了与一些最好的 JavaScript 开发人员进行良好合作的机会——其结果将帮助所有库的用户。出于这个原因,我们确保 Sizzle 能够完全独立工作(没有依赖项)。
此外,作为一种善意和合作的标志,我们将 Sizzle 的源代码发布到 Dojo 基金会。我们希望有一个共同的聚集地,每个人都可以一起工作,并且有一个明确的长期版权所有者。
目前我们正在与 Prototype、Dojo、Yahoo UI、MochiKit 和 TinyMCE(以及许多其他)合作,完善 Sizzle。
Live 事件
jQuery 现在支持“live 事件”——可以绑定到所有当前和未来元素的事件。使用事件委托和无缝的 jQuery 风格 API,结果既易于使用又非常快速。
有关 live 事件的更多信息,请参阅 .live() 文档。
在处理 live 事件时,我们希望找到一种快速且可扩展的解决方案。为此,我们需要一个能够处理委托元素过滤的 selector 引擎(大致来说就是“此选择器是否匹配此元素”)。新的 Sizzle 选择器引擎超越了我们的所有期望——比我们之前的解决方案快近 30 倍

通过使用高级过滤技术,我们能够为您带来一个不会使浏览器陷入困境并且可以扩展到页面上一次进行数十或数百次委托的事件委托解决方案。
jQuery 事件对象
Ariel Flesler 为 jQuery 1.3 带来了对 jQuery 事件系统的重大重构。这项更改的主要部分是新的 jQuery.Event 对象。该对象完全封装了通常在 W3C 兼容事件对象实现中找到的所有功能,并使其在所有浏览器中都能顺利工作。
事件系统还进行了一些单独的更改,稍后将在事件部分中进行详细介绍。
HTML 注入重写
与将 HTML 注入文档相关的所有代码(例如 append、prepend、before 和 after 方法)都经过了彻底修改。在分析 jQuery 应用程序时,我们发现这是最常见的瓶颈之一——因此迫切需要改进。提供的功能与 jQuery 早期版本中的功能相同,但具有更快(整体快约 6 倍)的额外优势

我们还彻底修改了 DOM 元素的创建(例如 $("<script/>")),并使其与调用 $(document.createElement("script")) 相同(结果更快且更合理)。
Offset 重写
Brandon Aaron 认为 .offset() 方法的完整重写是 1.3 版本应该做的。从头开始重写,它不仅更好地处理了跨浏览器问题,而且速度更快

与 1.2.6 版本中的 offset 方法相比,性能提升了近 3 倍,这次重写肯定会使您的复杂交互更加顺利。
不再进行浏览器嗅探
此版本的主要功能之一是您可能永远不会看到或直接处理它,但这是一项重要的更改,将有助于使 jQuery 持续更长时间并减少错误:从 1.3 开始,jQuery 内部不再使用任何形式的浏览器/userAgent 嗅探——并且是第一个这样做的大型 JavaScript 库。
浏览器嗅探是一种技术,您会对其代码的工作方式在未来做出假设。通常这意味着假设特定的浏览器错误将始终存在——这经常导致浏览器进行更改和修复错误时代码中断。
相反,我们使用一种称为功能检测的技术,通过模拟特定的浏览器功能或错误来验证其是否存在。我们已将 jQuery 中使用的所有检查封装到一个对象中:jQuery.support。有关它的更多信息、功能检测以及此功能提供的功能,请参阅文档。
值得注意的是,jQuery.browser 仍然存在于 jQuery 中——并且在可预见的未来会一直存在(太多的插件和代码依赖于它)。也就是说,我们已经弃用了它,试图鼓励您——以及所有 JavaScript 开发人员——认真考虑在您的代码中使用功能检测。
升级
在 jQuery 1.3 中,我们试图最大程度地减少任何大型升级的麻烦——保持所有现有的公共 API。也就是说,请仔细阅读潜在的破坏性更改列表,以了解可能导致应用程序出现问题的更改。
注意:许多插件正在提供更新版本,以与 jQuery 1.3 配合使用。如果您在使用特定插件时遇到困难,请务必查看是否有新版本发布。特别是 jQuery UI 和 Validation 插件都已更新了与 jQuery 1.3 配合使用的版本。
下载
像往常一样,我们提供两个版本的 jQuery,一个经过压缩(我们现在使用 YUI Compressor 作为默认压缩器),一个未压缩(用于调试或阅读)。
https://code.jqueryjs.cn/jquery-1.3.min.js jQuery 压缩版 (18kb gzipped)
https://code.jqueryjs.cn/jquery-1.3.js jQuery 正式版 (114kb)
此外,Google 还在其服务器上为我们提供了一个 jQuery 副本。此 jQuery 副本会自动压缩和 gzip——并从 Google 快速边缘缓存服务器提供。
https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.3/jquery.min.js
您可以随意将上述 URL 直接包含在您的网站中,您将获得快速加载 jQuery 的所有性能优势。
更改
以下是进行的更改,可能对您的网页的向后兼容性产生微小的影响。
- 已删除 [@attr] 中的“@”。自 1.2 起已弃用,此旧语法不再有效。只需删除 @ 即可升级。
- 触发的事件现在会冒泡到 DOM。不明察觉的事件处理程序可能会意外地捕获比预期更多的事件。
- ready() 方法不再尝试保证等待所有样式表加载完毕。相反,所有 CSS 文件都应在页面上的脚本之前包含。
- .isFunction 现在更简单了,它不再处理一些奇怪的边缘情况(为了简单性和性能)。
- “a, b, c” 样式选择器的顺序可能会更改。支持 querySelectorAll 的浏览器(Safari、Firefox 3.5+、Opera 10+、IE 8+)将以文档顺序返回元素,其他浏览器将(目前)以指定的顺序返回它们。在 1.3.2 及更高版本中,所有逗号分隔的选择器都将以文档顺序返回。
- trigger 和 triggerHandler 方法不再接受数据数组中的事件对象。相反,它们应直接指定为参数。
- trigger 和 triggerHandler 函数中的未记录的“extra”函数也已删除。
- 内部 jQuery.event.trigger 不再返回处理程序返回的最后一个项目,而是根据 W3C 规范返回 true 或 false。您应该使用 jQuery.Event 对象来捕获特定的返回值。
- 您应该始终确保您的页面以标准模式运行。已知在怪异模式下某些方法无法正常工作。
- 一种旧的(已弃用)创建选择器插件的样式已被删除。以前您可以创建字符串编码的插件,这些插件后来会变成函数——这已被删除——请直接创建函数。
- jQuery.param(obj) 执行 obj 的函数,而不是将其转换为 String。
已弃用以下属性(为了功能检测和 jQuery.support,如概述中所述:jQuery.browser、jQuery.browser.version、jQuery.boxModel。
不再支持以下浏览器:Safari 2
性能
为了衡量 jQuery 不同部分性能,我们使用了 修改后的 SlickSpeed 测试套件 来运行我们的测试(改编为处理非选择器测试)。测试运行的原始结果如下(所有时间以毫秒为单位)。
我们使用了 Yahoo 主页的副本(一个具有代表性的复杂网页),并使用人们实际使用的选择器。针对人们当前使用的选择器将有助于提高现有和未来应用程序的性能。
Frameworks jQuery 1.2.6 jQuery 1.3 Dojo 1.2.3 MooTools 1.2.1 Prototype 1.6.0.3
Firefox 3 184 111 147 240 137
Firefox 3.5 113 34 105 135 55
Safari 3.2 71 15 64 76 50
Safari Nightly 46 15 65 47 18
Opera 9.6 107 75 73 132 87
IE 6 854 640 561 1611 3174
IE 7 210 181 150 490 761
Chrome 30 13 23 118 10
委托过滤测试
为了测试委托过滤,我们尝试查看给定元素是否匹配选择器。jQuery 1.3 和 Prototype 提供了用于处理此功能的本机方法(分别是 .is 和 .match),而 jQuery 1.2.6、Dojo 和 MooTools 都使用了“运行选择器并查看元素是否在结果中”的技术。
Frameworks jQuery 1.2.6 jQuery 1.3 Dojo 1.2.3 MooTools 1.2.1 Prototype 1.6.0.3
Firefox 3 3260 199 1630 3798 763
Firefox 3.5 1047 113 620 1101 298
Safari 3.2 1169 91 820 1223 188
Safari Nightly 911 65 294 590 125
Opera 9.6 1764 167 898 1976 451
IE 6 22142 1201 13000 17227 12827
IE 7 4908 341 2664 5497 2994
Chrome 959 125 700 939 153
DOM 操作测试
这些测试分析了插入 DOM 片段的性能(对于 jQuery 和 Prototype 来说是 HTML,对于 MooTools 来说是使用它们的 Element 类)。Dojo 没有提供任何用于注入 HTML 或构造 DOM 元素的显式辅助函数,因此被排除在外。
Frameworks jQuery 1.2.6 jQuery 1.3 MooTools 1.2.1 Prototype 1.6.0.3
Firefox 3 161 41 47 323
Firefox 3.5 113 31 42 78
Safari 3.2 77 10 25 41
Safari Nightly 87 22 22 31
Opera 9.6 130 23 36 84
IE 6 710 110 600 971
IE 7 560 60 330 460
Chrome 49 14 23 21
.offset() 测试
在多个元素上运行了 jQuery 的 .offset() 方法。
Frameworks jQuery 1.2.6 jQuery 1.3
Firefox 3 142 30
Firefox 3.5 45 23
Safari 3.2 92 18
Safari Nightly 75 39
Opera 9.6 39 26
IE 6 151 70
IE 7 100 50
Chrome 115 21
.hide()/.show() 结果
在多个元素上运行了 .hide() 和 .show() 方法。
Frameworks jQuery 1.2.6 jQuery 1.3
Firefox 3 2680 722
Firefox 3.5 1867 448
Safari 3.2 1015 577
Safari Nightly 532 306
Opera 9.6 2327 1173
IE 6 8242 2715
IE 7 1912 961
Chrome 1922 551