jQuery 3.4.0 发布

发布日期: 作者:

jQuery 有了一个新版本!距离我们上次发布已经有一段时间了,但我们预计这将是 3.x 分支的最后一个次要版本,然后我们将继续进行大修,也就是 jQuery 4.0。但在我们开始 4.0 之前,我们很高兴与大家分享 jQuery 3.4.0 中包含的错误修复和改进。以下是一些亮点

.width.height 的性能提升

在获取和设置尺寸时,某些情况下会导致布局抖动,这基本上意味着浏览器计算布局的次数比必要的多。我们修复了除 IE 以外的所有浏览器的这个问题,在 IE 中无法避免这个问题。

noncenomodule 支持

为了支持通过 .html 和 .append 等方法添加脚本元素,jQuery 会将它们分开,并将新的脚本标签添加到加载并执行远程内容。在此过程中,noncenomodule 等属性会被忽略,但 jQuery 3.4.0 现在会保留它们。

单选按钮:事件处理程序中的预期状态

我们之前已经修复了复选框的相同问题,但意外地遗漏了单选按钮输入。在下面的示例中,第一次单击元素时,会记录 true。我们对其进行了修复,以便在执行事件处理程序之前更新 checked 属性。

示例

var $radios = jQuery(".example");
var $firstRadio = $radios.first();
var firstCheckedState = $firstRadio.prop("checked");
$radio.on("click", function() {
  // true in <3.4.0
  console.log($firstRadio.prop("checked") === firstCheckedState);
});
$radios.eq(1).click();

轻微漏洞修复:Object.prototype 污染

jQuery 3.4.0 包含一个修复,用于使用 jQuery.extend(true, {}, ...) 时出现的一些意外行为。如果未经消毒的源对象包含可枚举的 __proto__ 属性,则它可能会扩展本机 Object.prototype。此修复包含在 jQuery 3.4.0 中,但 补丁差异 存在于修补以前的 jQuery 版本。

示例

jQuery.extend(true, {},
  JSON.parse('{"__proto__": {"test": true}}')
);
console.log( "test" in {} ); // true

请注意,虽然 jQuery 尽最大努力保护用户免受安全漏洞,但 jQuery 是一个 DOM 操作库,通常会按照您的指示执行操作。在这种情况下,行为可能是意外的,因此 jQuery.extend 将不再写入名为 __proto__ 的任何属性。但是,这种防护措施不能替代良好的安全实践,例如用户输入消毒。

弃用位置选择器和 Sizzle 的终结

jQuery 的基本 API 是选择一些东西,然后对所选内容执行某些操作。jQuery 中的选择器引擎 Sizzle 处理了前半部分。它一直是一个快速高效的小型引擎,为像 querySelectorAll 这样的原生选择器 API 以及其他原生 JavaScript 和 CSS 选择器铺平了道路。现在,许多这些选择器已经进入现代浏览器,是时候告别 Sizzle 了。但为了在 jQuery 4.0 中移除 Sizzle,我们还需要移除我们称之为位置选择器的东西,它们是非标准选择器。

具体来说,jQuery 3.4.0 正在弃用 :first:last:eq:even:odd:lt:gt:nth。当我们移除 Sizzle 时,我们将用一个围绕 querySelectorAll 的小型包装器替换它,并且几乎不可能在没有更大的选择器引擎的情况下重新实现这些选择器。

我们认为这种权衡是值得的。请记住,我们仍然支持位置方法,例如 .first.last.eq。您可以使用位置方法完成任何可以使用位置选择器完成的操作。而且它们执行得更好。

升级

如果您从 jQuery 3.0+ 升级,应该没有兼容性问题。如果您尚未升级到 jQuery 3+,请查看 3.0 升级指南jQuery Migrate 3.0 插件 将帮助您识别代码中的兼容性问题。

请试用这个新版本,并 告知我们您遇到的任何问题

下载

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

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

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

您也可以从 npm 获取此版本

npm install jquery@3.4.0

精简版本

有时您不需要 ajax,或者您更喜欢使用专注于 ajax 请求的众多独立库之一。而且,使用 CSS 和类操作组合来进行 Web 动画通常更简单。除了包含 ajax 和效果模块的 jQuery 正式版本,我们还发布了一个“精简”版本,该版本不包括这些模块。如今,jQuery 的大小很少会成为加载性能问题,但精简版本比正式版本小约 6k gzip 字节。这些文件也适用于 npm 包和 CDN

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

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

这些更新已经作为 npm 和 Bower 上的当前版本可用。有关获取 jQuery 的所有方法的信息,请访问 https://jqueryjs.cn/download/。公共 CDN 今天将收到它们的副本,请给他们几天时间发布这些文件。如果您迫不及待地想快速开始,请使用我们 CDN 上的文件,直到他们有机会更新。

感谢

感谢所有参与此版本发布的人,包括通过提交补丁、报告错误或进行测试,包括 abnud1Jason Bedardbuddh4Kris BorchersAndrei FangliOleg GaidarenkoRichard GibsonMichal Golebiowski-OwczarekMarja HölttäDave MethvinEd SLuis Emilio Velasco SanchezSaptak Senguptatmybr11Bert Zhang 以及整个 jQuery 团队。

更改日志

GitHub 更改日志: 在 3.4.0 中修复的问题 | 所有更改

Ajax

核心

  • 使用 isAttached 检查元素的附加状态 (662083ed)
  • 对 jQuery.extend / jQuery.fn.extend 的微小效率修复 (#4246) (#42454ffb1df8)
  • 在 DOM 操作中,保留具有 src 属性的脚本上的 CSP nonce (#432300504037)
  • 在 DOM 操作中保留脚本上的 CSP nonce (#3541c7c2855e)
  • 支持通过 jQuery.globalEval 传递 nonce (#42785bdc85b8)
  • 在附加状态检查中识别 Shadow DOM (#35049b77def5)
  • 防止对 $.extend( true, … ) 的 Object.prototype 污染 (753d591a)

CSS

  • 确保驼峰式命名和短横线分隔命名不会因 CSS 变量而合并 (f8c1e902)
  • 避免填充 jQuery.cssProps (#39862b5f5d5e)
  • 使用非默认缩放正确检测滚动框支持 (#4029821bf343)
  • 不要自动将“px”附加到 CSS 变量 (#4064) (#406375b77b48)
  • 跳过对非元素属性动画的 px 附加逻辑 (f5e36bd8)
  • 除非必要,否则避免在宽度/高度获取器中强制重新流 (#4322a0abd15b)
  • 除非必要,否则不要在宽度/高度 cssHook 中读取 styles.position (#4185354f6036)
  • 不要自动将“px”附加到可能无单位的 CSS 网格属性 (#4007f997241f)

尺寸

  • 修复计算 SVG 上的 outerWidth (#3964e743cbd2)
  • 在设置宽度/高度时避免获取 boxSizing - 这在某些情况下可以避免强制重新流 (#399173d7e625)
  • 在 IE 中回退到 offsetWidth/Height 以使用边框盒 (#4102315199c1)

事件

操作

  • 正确检测具有单字符名称的 HTML 元素 (#4124979809c5)

其他

  • 添加 lockbot 的配置 (2348f399)
  • 更新许可证序言/尾注以安抚 Github 检查器 (29e76e25)

自述文件

  • 将 gitter 徽章添加到 README.md (7869f83d)
  • 添加 FOSSA 许可证扫描状态徽章 (45f08588)

选择器

序列化

  • jQuery.param: 当给出 null/undefined 时返回空字符串 (#26330645099e)

遍历

内部

  • uglify 及其选项的季节性更新 (09684ba3)
  • 删除不必要的 ESLint 异常 (dc05f3c1)
  • 在 jsdom 中运行基本测试套件 (0ec25abb)
  • 删除手动 QUnit 装置重置 (84b6a0be)
  • 使 Promises/A+ 测试使用点报告器而不是默认报告器 (ca9356ec)
  • 将 QUnit 从 1.23.1 更新到 2.9.2 (6ced2639)
  • 在 Node.js 10 而不是 8 上运行 Karma 浏览器测试 (16ad9889)
  • 更新 jsdom;将使用 Symbol polyfill 的测试迁移到 iframe 测试 (9cb124ed)
  • 从 ESLint 配置中删除过时的全局变量 (c10945d0)
  • 更新大多数依赖项 (8751e9ef)
  • 更新测试代码以兼容 QUnit 2.x (#4297) (c3498187)
  • 建议在 JS Bin 或 CodePen 上创建测试用例,放弃 JSFiddle (da44ff39)

关于“jQuery 3.4.0 发布”的 21 个想法

  1. 请不要删除选择器,尤其是 :first 和它的对应部分 :not(:first),因为出于未知原因,它从未进入 Chrome/Firefox,我们使用它来“变通”很多显示行为。

    更糟的是,Edge 将使用 Chromium 作为渲染引擎,这将使它不再支持。

    我想象删除它会破坏很多现有的网站。

  2. 哈哈,我刚刚查阅了 MDN 关于我之前关于 Edge、Chrome 和 Firefox 支持的评论。实际上 MDN 谈论的是 @page 的特定用法,因此无关紧要。

  3. 非常感谢您不断改进这个库。没有 jQuery,我无法像今天这样取得开发生涯的成就!

  4. 很棒的工作。我能够在几分钟内将一个大型电子商务项目从 jQuery 2.2.4 升级到 jQuery 3.4.0,没有遇到任何问题。继续努力。

  5. 如何在不使用 :nth-child 选择器的情况下选择表格列的所有单元格?

    这可以通过 table.find('td:nth-child(2)') 有效地完成,它选择*每行*的第二个子元素。使用 .eq() 将仅选择*第一行*的第二个子元素。

  6. Anisa Petrai 说:

    您好,我想知道这是否是问题所在。我在自动化中遇到了以下错误。我升级到最新版本,但在手机模拟中,浏览器的大小发生了变化。我使用 codeception,每次我运行一个步骤时,我的浏览器大小都会发生变化。

  7. 您好,
    请不要删除选择器,尤其是 :first 和它的对应部分 :not(:first),因为出于未知原因,它从未进入 Chrome/Firefox,我们使用它来“变通”很多显示行为。

  8. 如果使用 jquery-validation-engine,所有错误消息将移到表格布局的左上角。我猜 Jquery 3.4.0 的 position() 已经退化。