jQuery 3.0 正式发布!

发布于 作者

jQuery 3.0 现在发布了!这个版本的工作已经进行了自 2014 年 10 月以来。我们着手创建一个更精简、更快速的 jQuery 版本(同时考虑到向后兼容性)。我们删除了所有旧的 IE 解决方法,并在有意义的情况下利用了一些更现代的网络 API。它是 2.x 分支的延续,但进行了一些我们认为长期以来应该进行的重大更改。虽然 1.12 和 2.2 分支在一段时间内将继续接收关键支持补丁,但它们将不会获得任何新功能或主要修订。jQuery 3.0 是 jQuery 的未来。如果您需要 IE6-8 支持,您可以继续使用最新的 1.12 版本。

尽管版本号为 3.0,我们预计这些发布在升级现有代码时不会带来太多麻烦。是的,有一些“破坏性更改”证明了主要版本号的提升,但我们希望这些破坏不会影响太多人。

为了帮助升级,我们有一个全新的 3.0 升级指南。并且 jQuery Migrate 3.0 插件 将帮助您识别代码中的兼容性问题。您对这些更改的反馈将对我们有很大帮助,因此请在您的现有代码和插件上尝试一下!

您可以从 jQuery CDN 获取文件,或直接链接到它们

https://code.jqueryjs.cn/jquery-3.0.0.js

https://code.jqueryjs.cn/jquery-3.0.0.min.js

您还可以从 npm 获取发布版本

npm install jquery@3.0.0

此外,我们还发布了 jQuery Migrate 3.0。我们强烈建议使用它来解决 jQuery 3.0 中破坏性更改的任何问题。您可以在这里获取这些文件

https://code.jqueryjs.cn/jquery-migrate-3.0.0.js

https://code.jqueryjs.cn/jquery-migrate-3.0.0.min.js

npm install jquery-migrate@3.0.0

有关使用 jQuery Migrate 升级您的 jQuery 1.x 和 2.x 页面到 jQuery 3.0 的更多信息,请参阅 jQuery Migrate 1.4.1 博客文章

精简版

最后,我们在此版本中添加了一些新内容。有时您不需要 ajax,或者您更喜欢使用许多专注于 ajax 请求的独立库。而且,通常使用 CSS 和类操作进行所有网络动画会更简单。除了包含 ajax 和效果模块的常规 jQuery 版本之外,我们还发布了一个“精简”版本,该版本排除了这些模块。总而言之,它排除了 ajax、效果和当前已弃用的代码。这些天 jQuery 的大小很少成为加载性能问题,但精简版本比常规版本小约 6k gzip 字节 – 23.6k 与 30k。这些文件也可用在 npm 包和 CDN 上

https://code.jqueryjs.cn/jquery-3.0.0.slim.js

https://code.jqueryjs.cn/jquery-3.0.0.slim.min.js

此构建是使用我们的自定义构建 API 创建的,该 API 允许您排除或包含任何您喜欢的模块。有关更多信息,请查看 jQuery README
 

与 jQuery UI 和 jQuery Mobile 的兼容性

虽然大多数事情都可以正常工作,但 jQuery UI 和 jQuery Mobile 将在即将发布的版本中解决一些问题。如果您发现问题,请记住它可能已经在上游得到解决,并且使用 jQuery Migrate 3.0 插件 应该可以解决它。请期待即将发布的版本。

 

主要变更

以下只是这些版本中主要新功能、改进和错误修复的亮点,您可以在 3.0 升级指南 上深入了解更多详细信息。完整的已修复问题列表可在我们的 GitHub 错误跟踪器 上找到。如果您阅读了 3.0.0-rc1 的博客文章,则以下功能相同。

jQuery.Deferred 现在与 Promises/A+ 兼容

jQuery.Deferred 对象已更新,与 Promises/A+ 和 ES2015 Promises 兼容,并经过 Promises/A+ Compliance Test Suite 验证。这意味着我们需要对 .then() 方法进行一些重大更改。可以通过用现在已弃用的 .pipe() 方法(具有相同的签名)替换任何 .then() 的使用来恢复旧行为。

  1. .then() 回调中抛出的异常现在变成拒绝值。以前,异常会一直冒泡,从而中止回调执行。任何依赖于抛出异常的 deferred 的 deferred 都将永远无法解决。

  2. 示例:未捕获的异常与拒绝值

    
    var deferred = jQuery.Deferred();
    deferred.then(function() {
      console.log("first callback");
      throw new Error("error in callback");
    })
    .then(function() {
      console.log("second callback");
    }, function(err) {
      console.log("rejection callback", err instanceof Error);
    });
    deferred.resolve();
    

    以前,“第一个回调”被记录,并且抛出了错误。所有执行都已停止。既不会记录“第二个回调”,也不会记录“拒绝回调”。新的、符合标准的行为是,您现在将看到“拒绝回调”和 true 被记录。 err 是第一个回调的拒绝值。


  3. .then() 创建的 Deferred 的解析状态现在由其回调控制——异常成为拒绝值,而非 thenable 的返回值成为完成值。 以前,拒绝处理程序中的返回值会成为拒绝值。

  4. 示例:来自拒绝回调的返回值

    
    var deferred = jQuery.Deferred();
    deferred.then(null, function(value) {
      console.log("rejection callback 1", value);
      return "value2";
    })
    .then(function(value) {
      console.log("success callback 2", value);
      throw new Error("exception value");
    }, function(value) {
      console.log("rejection callback 2", value);
    })
    .then(null, function(value) {
      console.log("rejection callback 3", value);
    });
    deferred.reject("value1");
    

    之前,这会记录“rejection callback 1 value1”、“rejection callback 2 value2”和“rejection callback 3 undefined”。

    新的、符合标准的行为是,这会记录“rejection callback 1 value1”、“成功 callback 2 value2”和“rejection callback 3 [object Error]”。


  5. 回调始终异步调用,即使 Deferred 已经解决。 之前,这些回调在绑定时同步执行。

  6. 示例:异步与同步

    
    var deferred = jQuery.Deferred();
    deferred.resolve();
    deferred.then(function() {
      console.log("success callback");
    });
    console.log("after binding");
    

    之前,这会记录“success callback”然后“after binding”。 现在,它会记录“after binding”然后“success callback”。


重要提示:虽然捕获的异常对于浏览器内调试具有优势,但使用拒绝回调处理它们更具声明性(即显式性)。 请记住,这意味着您必须始终为使用 promise 的情况添加至少一个拒绝回调。 否则,某些错误可能会被忽略。

我们构建了一个插件来帮助调试兼容 Promises/A+ 的 Deferreds。 如果您在控制台中看不到足够的信息来确定错误的来源,请查看 jQuery Deferred Reporter Plugin

jQuery.when 也已更新为接受任何 thenable 对象,其中包括本机 Promise 对象。

https://github.com/jquery/jquery/issues/1722
https://github.com/jquery/jquery/issues/2102

为 Deferred 添加了 .catch()

catch() 方法被添加到 promise 对象中,作为 .then(null, fn) 的别名。

https://github.com/jquery/jquery/issues/2102

错误案例不会静默失败

也许在某个深刻的时刻,您会想知道:“窗口的偏移量是多少?” 然后您可能意识到这是一个疯狂的问题——窗口怎么可能拥有偏移量?

在过去,jQuery 有时会尝试让像这样的一些案例返回某些内容,而不是抛出错误。 在询问窗口偏移量的特定案例中,到目前为止的答案一直是 { top: 0, left: 0 }。 使用 jQuery 3.0,这些案例将抛出错误,以便不会默默忽略疯狂的请求。 请尝试此版本,看看是否有任何代码依赖于 jQuery 来掩盖无效输入的错误。

https://github.com/jquery/jquery/issues/1784

删除了已弃用的事件别名

.load.unload.error,自 jQuery 1.8 起已弃用,现在已不再存在。 使用 .on() 注册侦听器。

https://github.com/jquery/jquery/issues/2286

动画现在使用 requestAnimationFrame

在支持 requestAnimationFrame API 的平台上,几乎所有平台都支持 IE9 和 Android<4.4,jQuery 现在将在执行动画时使用该 API。 这应该会产生更流畅的动画并使用更少的 CPU 时间——并且在移动设备上还可以节省电池电量。

jQuery 几年前尝试使用 requestAnimationFrame,但与现有代码存在 严重的兼容性问题,因此我们不得不将其回滚。 我们认为我们已经通过在浏览器选项卡不可见时暂停动画解决了大多数这些问题。 尽管如此,任何依赖于动画始终以近乎实时运行的代码都在做出不切实际的假设。

某些 jQuery 自定义选择器的速度大幅提升

感谢 Google 的 Paul Irish 的侦探工作,我们确定了一些可以跳过大量额外工作的情况,当在同一文档中使用像 :visible 这样的自定义选择器多次时。 该特定案例现在快了 17 倍!

请记住,即使有了这项改进,像 :visible:hidden 这样的选择器也可能很昂贵,因为它们依赖于浏览器来确定元素是否实际显示在页面上。 在最坏的情况下,这可能需要完全重新计算 CSS 样式和页面布局! 虽然我们通常不阻止使用它们,但我们建议测试您的页面,以确定这些选择器是否会导致性能问题。

此更改实际上已包含在 1.12/2.2 中,但我们想重申一下 jQuery 3.0。

https://github.com/jquery/jquery/issues/2042

如上所述,升级指南现在可供任何准备尝试此版本的人使用。 除了有助于升级之外,它还列出了更多值得注意的更改。

 

感谢

感谢所有为本次发布贡献代码、提交问题报告以及提供其他帮助的人员,包括但不限于 Jason Bedard, Fredrik Blomqvist, Leonardo Braga, Ralin Chimev, Jon Dufresne, Oleg Gaidarenko, Richard Gibson, Michał Gołębiowski, Scott González, Zack Hall, Alexander K, Martijn W. van der Lee, Alexander Lisianoi, Steve Mao, Dave Methvin, Jha Naman, Jae Sung Park, Todor Prikumov, William Robinet, Felipe Sateler, Damian Senn, Josh Soref, Jun Sun, Christophe Tafani-Dereeper, Vitaliy Terziev, Joe Trumbull, Bernhard M. Wiedemann, Devin Wilson, 和 Henry Wong

 

变更日志

Ajax

  • 减少 21 个字节 (eaa3e9f)
  • 保留请求中的 URL 哈希 (#1732, e077ffb)
  • 使用正确的上下文执行 jQuery#load 回调 (#3035, 5d20a3c)
  • 确保 ajaxSettings.traditional 仍然有效 (#3023, df2051c)
  • 删除不必要的 jQuery.trim 用法 (0bd98b1)

属性

  • 避免非小写属性 getter 的无限递归 (#3133, e06fda6)
  • 添加支持注释并修复 @ tabIndex 钩子 (9cb89bf)
  • 为 select 上的设置值去除/折叠空格 (#2978, 7052698)
  • 删除冗余的父级检查 (b43a368)
  • 修复在 IE<=11 中设置选项的选中状态 (#2732, 780cac8)

CSS

  • 不要解决 IE 11 全屏 iframe 尺寸问题 (#3041, ff1a082)
  • 除非它们具有 display: none,否则将分离的元素切换为可见 (#2863, 755e7cc)
  • 确保 elem.ownerDocument.defaultView 不为 null (#2866, 35c3148)
  • 将 animation-iteration-count 添加到 cssNumber (#2792, df822ca)
  • 恢复 .show 中的级联覆盖行为 (#2654, #2308, dba93f7)
  • 阻止 Firefox 将断开连接的元素视为级联隐藏 (#2833, fe05cf3)

核心

Deferred

  • 将 jQuery.when 中的两个路径分开 (#3029, 356a3bc)
  • 为 jQuery.when 原始转换提供显式的 undefined 上下文 (#3082, 7f1e593)
  • 删除默认回调上下文 (#3060, 7608437)
  • 警告可能为编程错误的异常 (#2736, 36a7cf9)
  • 正确地从解包的 promise 中传播进度 (#3062, d5dae25)
  • 在可能的情况下使 jQuery.when 同步 (#3100, de71e97)
  • 删除 $.when 中的未记录的进度通知 (#2710, bdf1b8f)
  • 为异常提供更好的堆栈诊断 (07c11c0)

Dimensions

  • 添加负边框和填充的测试 (f00dd0f)

文档

  • 修复各种拼写错误 (aae4411)
  • 更新与 IE 相关的支持注释 (693f1b5)
  • 修复 attributes 模块中的不正确的注释 (5430c54)
  • 更新支持 https 的链接 (b0b280c)
  • 更新支持注释以遵循新的语法 (6072d15)
  • 尽可能使用 HTTPS (1de8346)
  • 为 jsfiddle 和 jsbin 使用 HTTPS URL (63a303f)
  • 添加 FAQ 以减少问题中的噪音 (dbdc4b7)
  • 添加关于使用 AMD 加载源代码的说明 (#2714, e0c25ab)
  • 添加关于使用 AMD 进行代码组织的说明 (#2750, dbc4608)
  • 引用新的功能指南和 API 原则 (#2320, 6054139)

Effects

事件

  • 允许在没有目标的条件下构造 jQuery.Event (#3139, 2df590e)
  • 添加触摸事件属性,消除对插件的需求 (#3104, f595808)
  • 添加最常用的指针事件属性 (7d21f02)
  • 删除 fixHooks、propHooks;切换到使用 addProp 的 ES5 getter (#3103, #1746, e61fccb)
  • 使事件分派可被 JavaScript 引擎优化 (9f268ca)
  • 在添加时评估委托选择器 (#3071, 7fd36ea)
  • 覆盖无效委托选择器边缘情况 (e8825a5)
  • 修复使用 null 处理程序的 .on() 链 (#2846, 17f0e26)
  • 删除事件对象的 pageX/pageY 填充 (#3092, 931f45f)

活动

  • 不要执行来自模拟的本机 stop(Immediate)Propagation (#3111, 94efb79)

操作

Offset

  • 解决严格模式 ClientRect “无 setter” 异常 (3befe59)

选择器

序列化

  • 将字面量和函数返回的 null/undefined 视为相同 (#3005, 9fdbdd3)
  • 减小尺寸 (91850ec)

支持

Tests

  • 考虑 Safari 9.1 (234a2d8)
  • 将选择限制为 attributes.js 中的 #qunit-fixture (ddb2c06)
  • 将 Edge 的 clearCloneStyle 预期支持设置为 true (28f0329)
  • 修复 Android 5.0 的库存 Chrome 浏览器和 Yandex.Browser 中的 Deferred 测试 (5c01cb1)
  • 添加 jQuery.isPlainObject 的额外测试 (728ea2f)
  • 构建:更新 QUnit 并修复不正确的测试 (b97c8d3)
  • 修复 Android 4.4 中的操作测试 (0b0d4c6)
  • 删除一个属性测试的副作用 (f9ea869)
  • 考虑新的偏移测试 (f52fa81)
  • 使 iframe 测试在检查 isReady 后等待 (08d73d7)
  • 重构 testIframe() 以使其更 DRY 和一致 (e5ffcb0)
  • 弱化 jQuery.when 对 jQuery.ready.then 的同步假设 (f496182)
  • 测试元素位置超出视图范围(#2909a2f63ff
  • 使 Safari 9.0/9.1 的正则表达式匹配更具弹性(7f2ebd2

Traversing

  • .not/.filter 与非元素的一致性(#28080e2f8f9
  • 永远不要让 .closest() 匹配位置选择器(#2796a268f52
  • 恢复 .find 中的 jQuery push 行为(#23704d3050b