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 是选择某样东西,然后对所选的东西做点什么。Sizzle,jQuery 中的选择器引擎,处理前半部分。它一直是一个快速高效的小型引擎,为 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 升级指南。the 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 和类操作的组合通常更简单。除了包含 ajax 和效果模块的 jQuery 正式版本,我们还发布了一个“精简”版本,排除了这些模块。如今,jQuery 的大小很少成为加载性能问题,但精简版本比正式版本压缩后小约 6k 字节。这些文件也在 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 操作中,保留 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)
- 除非必要,否则避免在 width/height 获取器中强制执行重绘 (#4322,a0abd15b)
- 除非必要,否则不要在 width/height cssHook 中读取 styles.position (#4185,354f6036)
- 不要自动将“px”附加到可能无单位的 CSS 网格属性 (#4007,f997241f)
尺寸
- 修复 SVG 上的 outerWidth 计算 (#3964,e743cbd2)
- 避免在设置 width/height 时获取 boxSizing – 这在某些情况下可以避免强制执行重绘 (#3991,73d7e625)
- 在 IE 中,对于 border-box,回退到 offsetWidth/Height (#4102,315199c1)
事件
- 防止 leverageNative 双重触发 focusin (fe5f04de)
- 向 Event 对象添加“code”属性 (#3978,899c56f6)
- 利用 focus/blur/click 的原生事件;传播其他数据 (#1741,#3423,#3751,#4139,669f720e)
- 在 DOM 操作中,尊重脚本 nomodule 属性 (#4281,e4de8b46)
- 将 _evalUrl jQuery.ajax 调用恢复为 dataType: script (13de7c9e)
- 仅评估 HTTP 成功脚本 src (#4126,c2026b11)
操作
其他
README
选择器
序列化
遍历
内部
- 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)