jQuery 3.4.0 发布
jQuery 有了一个新版本!距离我们上次发布已经有一段时间了,但我们预计这将是 3.x 分支的最后一个次要版本,然后我们将继续进行大修,也就是 jQuery 4.0。但在我们开始 4.0 之前,我们很高兴与大家分享 jQuery 3.4.0 中包含的错误修复和改进。以下是一些亮点
.width
和 .height
的性能提升
在获取和设置尺寸时,某些情况下会导致布局抖动,这基本上意味着浏览器计算布局的次数比必要的多。我们修复了除 IE 以外的所有浏览器的这个问题,在 IE 中无法避免这个问题。
nonce
和 nomodule
支持
为了支持通过 .html 和 .append 等方法添加脚本元素,jQuery 会将它们分开,并将新的脚本标签添加到加载并执行远程内容。在此过程中,nonce
和 nomodule
等属性会被忽略,但 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 上的文件,直到他们有机会更新。
感谢
感谢所有参与此版本发布的人,包括通过提交补丁、报告错误或进行测试,包括 abnud1、Jason Bedard、buddh4、Kris Borchers、Andrei Fangli、Oleg Gaidarenko、Richard Gibson、Michal Golebiowski-Owczarek、Marja Hölttä、Dave Methvin、Ed S、Luis Emilio Velasco Sanchez、Saptak Sengupta、tmybr11、Bert Zhang 以及整个 jQuery 团队。
更改日志
GitHub 更改日志: 在 3.4.0 中修复的问题 | 所有更改
Ajax
核心
- 使用 isAttached 检查元素的附加状态 (662083ed)
- 对 jQuery.extend / jQuery.fn.extend 的微小效率修复 (#4246) (#4245、4ffb1df8)
- 在 DOM 操作中,保留具有 src 属性的脚本上的 CSP nonce (#4323、00504037)
- 在 DOM 操作中保留脚本上的 CSP nonce (#3541、c7c2855e)
- 支持通过 jQuery.globalEval 传递 nonce (#4278、5bdc85b8)
- 在附加状态检查中识别 Shadow DOM (#3504、9b77def5)
- 防止对 $.extend( true, … ) 的 Object.prototype 污染 (753d591a)
CSS
- 确保驼峰式命名和短横线分隔命名不会因 CSS 变量而合并 (f8c1e902)
- 避免填充 jQuery.cssProps (#3986、2b5f5d5e)
- 使用非默认缩放正确检测滚动框支持 (#4029、821bf343)
- 不要自动将“px”附加到 CSS 变量 (#4064) (#4063、75b77b48)
- 跳过对非元素属性动画的 px 附加逻辑 (f5e36bd8)
- 除非必要,否则避免在宽度/高度获取器中强制重新流 (#4322、a0abd15b)
- 除非必要,否则不要在宽度/高度 cssHook 中读取 styles.position (#4185、354f6036)
- 不要自动将“px”附加到可能无单位的 CSS 网格属性 (#4007、f997241f)
尺寸
- 修复计算 SVG 上的 outerWidth (#3964、e743cbd2)
- 在设置宽度/高度时避免获取 boxSizing - 这在某些情况下可以避免强制重新流 (#3991、73d7e625)
- 在 IE 中回退到 offsetWidth/Height 以使用边框盒 (#4102、315199c1)
事件
- 防止 leverageNative 双重触发 focusin (fe5f04de)
- 将“code”属性添加到事件对象 (#3978、899c56f6)
- 利用焦点/模糊/单击的原生事件;传播附加数据 (#1741、#3423、#3751、#4139、669f720e)
- 在 DOM 操作中尊重脚本 nomodule 属性 (#4281、e4de8b46)
- 将 _evalUrl jQuery.ajax 调用还原为 dataType: script (13de7c9e)
- 仅评估 HTTP 成功脚本 src (#4126、c2026b11)
操作
其他
自述文件
选择器
序列化
遍历
内部
- 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 的最新版本!
不错的工作。期待在未来使用原生浏览器选择器进行更多速度改进。
jQuery 仍然活着,谢谢您。
请不要删除选择器,尤其是 :first 和它的对应部分 :not(:first),因为出于未知原因,它从未进入 Chrome/Firefox,我们使用它来“变通”很多显示行为。
更糟的是,Edge 将使用 Chromium 作为渲染引擎,这将使它不再支持。
我想象删除它会破坏很多现有的网站。
哈哈,我刚刚查阅了 MDN 关于我之前关于 Edge、Chrome 和 Firefox 支持的评论。实际上 MDN 谈论的是 @page 的特定用法,因此无关紧要。
感谢您提供这个很棒的库。
其他非标准伪选择器怎么样,比如 :input 或 :hidden?
继续努力。不要让那些反对者让你灰心。JQuery 仍然是 Web 浏览器开发的基础。
感谢您进行的微小更新,我迫不及待地想看到 jquery 4.0?
@MM 这样的选择器扩展仍然是可能的,但是位置选择器要复杂得多。
嘿,您在 Android 手机上有一个容器撑破了页面!
非常感谢您不断改进这个库。没有 jQuery,我无法像今天这样取得开发生涯的成就!
哇,等新版本等了很久!
很棒的工作。我能够在几分钟内将一个大型电子商务项目从 jQuery 2.2.4 升级到 jQuery 3.4.0,没有遇到任何问题。继续努力。
如何在不使用 :nth-child 选择器的情况下选择表格列的所有单元格?
这可以通过 table.find('td:nth-child(2)') 有效地完成,它选择*每行*的第二个子元素。使用 .eq() 将仅选择*第一行*的第二个子元素。
您好,我想知道这是否是问题所在。我在自动化中遇到了以下错误。我升级到最新版本,但在手机模拟中,浏览器的大小发生了变化。我使用 codeception,每次我运行一个步骤时,我的浏览器大小都会发生变化。
您好,
请不要删除选择器,尤其是 :first 和它的对应部分 :not(:first),因为出于未知原因,它从未进入 Chrome/Firefox,我们使用它来“变通”很多显示行为。
非常棒的工作,
不要让那些反对者让你灰心。JQuery 仍然是 Web 浏览器开发的基础。
如果使用 jquery-validation-engine,所有错误消息将移到表格布局的左上角。我猜 Jquery 3.4.0 的 position() 已经退化。
感谢您持续的支持。
但是 4.0 版本呢?什么时候会有消息?
请在这个表单中添加一些验证码,以尝试避免如此大量的垃圾邮件。