大家好,jQuery 用户们!我们已经有一段时间没有和大家联系了,但我们并没有闲着。jQuery 核心团队一直在埋头研究 jQuery 1.8,现在我们的第一个 beta 版已经发布!您可以在 jQuery CDN 上获取代码:
在您当前的 jQuery 代码中试用一下,并告诉我们它对您来说是否有效。如果您遇到问题,请提交错误报告,包括测试用例,并确保您提到您是在 jQuery 1.8 Beta 1 上进行测试。
本月晚些时候将在旧金山举行的jQuery 大会上会有更多激动人心的 jQuery 消息,随后会发布博客文章。
jQuery 现在为互联网上大约一半的主要网站提供动力;这是一个巨大的成功,但我们并没有止步不前。Web 浏览器及其运行的设备在过去六年中经历了翻天覆地的变化。Web 开发流程正在不断发展,以适应正在发生的改变。作为回应,jQuery 也在不断发展。
这种发展的一部分不仅仅是知道要添加什么,还要知道要删除什么。jQuery 的插件架构使开发人员能够轻松地扩展 jQuery 核心提供的功能,只要这对他们自己的需求有意义。因此,对核心添加内容的标准设置得非常高。我们不想为不需要特定功能的人创建体积、复杂性或性能损失。
同样,我们对人们使用 jQuery 的方式有足够的经验,知道一些最初看起来很不错的功能实际上并不那么好。我们不想永远保留这些功能,而是希望最终将其删除。实际上,我们希望更容易地创建 jQuery 的版本,从而排除您不需要或不想要的东西,尤其是在移动环境中,空间可能很宝贵。
考虑到这一点,以下是我们为 jQuery 1.8 计划的一些更改,这些更改将使其成为所有基于 HTML 的网页和应用程序的更好基础,无论其平台如何:
模块化
从 jQuery 1.8 开始,您可以构建 jQuery 的自定义版本,如果您不需要其功能,则可以排除一个或多个模块。这个功能非常容易实现,因为我们使用 Ben Alman 的强大的grunt工具构建了新的构建系统。要构建自己的自定义版本,请从 Github 上获取 jQuery 核心仓库的副本,并使用 grunt 命令行选项来排除模块。有关更多信息,请参见README 文件。
您目前可以排除的模块有 ajax、css、dimensions、effects 和 offset。例如,如果您的应用程序仅使用样式表和通过类来控制页面上项目可见性和大小的 CSS 动画,您可以构建一个不包含 css、dimensions、effects 和 offset 模块的版本。如果您不需要任何可选模块,您自定义的 jQuery 版本的大小大约为 21KB(压缩并 gzip 压缩后)。
不过,请不要担心,构建自己的 jQuery 绝对是可选的。jQuery 始终以压缩和未压缩的形式作为单个文件分发,并且可以在 CDN 上获得。我们仍然预计这将是大多数 jQuery 开发人员采用的方式,因为它简单易行。例如,当您包含一个您没有编写的 jQuery 插件时,使用完整的 jQuery 可以确保您不会被插件中潜藏的某些依赖项所困扰。
供应商前缀 CSS 属性
W3C 在提出使用供应商前缀来表示尚未标准化的 CSS 功能方面是用心良苦,但结果却并非童话故事。Web 开发人员面临着在样式表中包含所有供应商前缀属性名的噩梦。jQuery 1.8 有点减轻了这种痛苦。我们会自动获取非前缀属性名,并生成适合当前浏览器的前缀,因此您不必手动操作。例如,在 Chrome 中,jQuery 调用 $("#myscroll").css("marquee-direction", "backwards")
将将 CSS 设置为 -webkit-marquee-direction: backwards
。
动画(效果)
我们的动画代码在过去几年中变得越来越混乱,而我们希望在 1.8 中能够控制住这个怪兽。但这不仅仅是一次清理工作;还有一些扩展点可以让添加或修改动画变得更加容易。目前只有一些新功能的初步文档,但在第一个 beta 版本中,我们的主要重点将是确保任何现有的动画代码都能正常工作。
如今,浏览器在提供高效动画方面做得越来越好,尤其是在 CSS 过渡方面。然而,仍然有许多用户使用无法进行基于 CSS 的动画的浏览器。在 jQuery 1.8 中,您可以获得两全其美的体验。如果您需要支持没有内置动画的旧浏览器,新的 $.Animation
提供了一个坚实的基础,并修复了以前版本中的许多错误。如果您只需要针对现代浏览器及其原生支持的动画,您可以这样做,并完全排除动画模块。
Sizzle CSS 选择器引擎
jQuery 的选择器引擎在 1.8 中进行了重大重写。重写最显着的优势是选择器匹配的广泛 性能改进,以及对最常见选择器的改进快捷方式。
此外,Sizzle 处理了更多边缘情况和错误,包括对多个组合器 (~ > +) 的改进支持,以及对 querySelectorAll
中浏览器错误的更好检测。有关完整列表,请参阅选择器模块中的错误列表。
XSS 防护
在设计上,$()
方法可以创建 HTML 元素,如果它传递一个带有内联脚本的 <script>
标签或一个 src
属性,它将运行脚本。开发人员有时会忘记这一点,将来自不可信来源(例如 URL 或用户输入)的字符串传递给 jQuery。在这种情况下,有人可能会将脚本注入页面,从而窃取 cookie 或以某种方式损害页面。
这些跨站点脚本 (XSS) 攻击在许多网站上很常见,无论它们是否使用 jQuery,但我们希望确保 jQuery 不会加剧问题。在 jQuery 1.9(紧随 1.8 的下一个版本)中,我们将收紧 $()
方法的“看起来像 HTML”规则。只有当第一个字符为小于号时,字符串才会被视为 HTML,否则它将被视为 CSS 选择器。
为了进一步防止无意中注入脚本,jQuery 1.8 引入了一种新方法:$.parseHTML
。它允许您将字符串指定为 HTML,并确保它们将被解析为 HTML,这是 $()
做不到的,因为它也将字符串解释为选择器。它还提供了一种将 HTML 解析为 DOM 片段并控制 HTML 可能包含的任何脚本执行的方法。这在由 内容安全策略 (CSP) 控制的 JavaScript 环境中尤为重要,因为注入的脚本可能会导致安全警告或异常。
对于比创建单个元素 (例如 $("<p/>")
) 更复杂的情况,尤其是对于从外部数据构建字符串的情况,我们强烈建议使用 $.parseHTML
。从 jQuery 1.9 开始,由于这些更严格的规则,某些 HTML 字符串将不再被 $()
识别。
春季大扫除
在 jQuery 1.8 中,我们还将弃用和删除“绊脚石”:低效、无效或不可取的 API 和功能。我们意识到,仍然有一些现有的 jQuery 代码需要这些功能。为了提供一个轻松的未来升级路径,在删除这些弃用项后,我们将它们中的许多放在一个兼容性插件中。您可以关注其 GitHub 仓库 上开发的兼容性插件。
以下以“弃用”或“删除”开头的票证详细说明了所有更改,但以下是一些值得注意的更改。
$.browser
:从 jQuery 1.4 开始,我们就一直在宣传通过用户代理字符串进行浏览器检测是一个坏主意。但我们一直是这种不良做法的推手,因为我们一直在提供 $.browser
。从 jQuery 1.9 开始,我们将完全删除它,您需要使用 1.9 兼容性插件。如果您的代码还没有摆脱浏览器检测,请查看 Modernizr,它提供了一套非常全面的功能检测,您可以使用它们。当然,您也可以直接读取 navigator.userAgent
字符串中的内容,没有什么可以阻止您,除了您的良心。
$.sub
:此方法在 jQuery 1.5 中引入,但没有证明它足够有用或健壮,无法证明它留在核心中的合理性。它将在 jQuery 1.9 中移至兼容性插件。
全局 ajax 事件:由 $.ajax
触发的 ajaxStart
等事件目前可以附加到任何元素,甚至附加到根本不在文档中的元素!这会创建一个低效的特殊情况,因此我们在 1.8 中弃用了这种行为。从 1.9 开始,ajax 事件应该仅附加在 document
上。
以及更多...
1.8 中还有许多其他更改,也许查看我们一直在做的事情的最简单方法是查看正在修复的问题列表,其中包括功能和错误修复。以下是 1.8 的快照,它代表了今天的情况,但它并非一成不变。我们欢迎您就特定问题或 jQuery 的总体方向提供反馈!
jQuery 1.8 Beta 1 更改日志
1.8 Beta 1 版本的当前更改日志。
Ajax
- #8205: JSONP 随机结果导致 IE8 中发生内存泄漏
- #8653: jQuery.param 在查询字符串中输出“null”和“undefined”
- #10285: evalScript rcleanScript 替换在 IE8 中失败
- #10524: jQuery.fn.load 不会将 data 参数与 jQuery.ajaxSetup 合并
- #10944: $.ajax 并不总是返回实现 Promise 接口的对象
- #11013: 弃用/删除 $.ajax 中的 async 选项
- #11402: evalScript 函数在 IE 中出现错误 80020101
- #11743: jQuery 在 $.appendTo() 中对脚本标记 ajax 请求期间的错误保持沉默
- #11778: 缓存的 XHR 请求仍应异步解析
属性
- #11153: jQuery 1.7 在 IE 8 中删除回车符
- #11212: Sizzle.getText 在 IE 中将不可分割空格转换为空格
构建
核心
- #10657: 弃用/删除 jQuery#size(),转而使用 jQuery#length
- #11290: 选择器被解释为 HTML
- #11470: 添加内置 readyP promise
Css
- #10373:
document.defaultView
=> window
- #10413: 对于隐藏父元素的“box-sizing: border-box”子元素,width、innerWidth、innerHeight、outerWidth、outerHeight 不准确
- #10679: CSS3 供应商前缀支持
- #11004: 当 box-sizing 为 border-box 时,getWH 会错误地删除填充和边框宽度
- #11787: 删除 jQuery.curCSS
数据
- #10589: 删除 $.fn.data("events")
延迟
- #11010: 使 Deferred.then == Deferred.pipe 像 Promise/A
- #11011: 允许使用传统选项对象进行 $.Callbacks 标记
- #11736: 删除 Deferred .isResolved() 和 .isRejected()
- #11749: 当多个 Deferred 对象传递给 $.when() 时,保留上下文对象
尺寸
- #6724: 移动版 Safari (iPhone) 中的 $(window).height() 错误
- #10877: 使 outerWidth/Height 成为一个 setter
- #11293: 读取空 TD 的 width 或 outerWidth 会更改列宽度值
- #11604: 将 $(elem).width(-val) 从无操作更改为 $(elem).width(0)
- #11724: Firefox 12 中的 $(document).height() 发生了更改
效果
- #7109: animate width 在 webkit 上以无效宽度开始
- #7157: 动画回调显示元素仍然为“:animated”
- #8387: jQuery 1.5 hide/show 与 webkit 浏览器中内联和内联块元素一起使用时出现闪烁问题
- #8627: .animate() 在 IE 中对 letterSpacing 失败(1.5.1 中的回归)
- #8892: 在 jQuery.fx.off = true 的情况下,在对象显示之前会触发回调
- #9505: 在 WebKit 中混合使用百分比和像素时,animate() 出现问题
- #11635: 显式 overflow:auto 在动画期间被内联 overflow:hidden 覆盖
- #11755: animate 及其别名不应使用 :hidden 选择器
- #11854: 百分比动画跳到末尾
事件
- #8545: IE 中的事件泄漏
- #10067: 在 document.readyState === 'interactive' 时也触发 $.ready
- #11101: 弃用 trigger 方法中的“exclusive”事件选项
- #11328: 在 Windows 上,Ctrl 键不会将 event.metaKey 设置为 true
- #11500: 错误:当在 IE7 和 IE8 上手动触发时,不会执行“change”事件处理程序
- #11621: 在 document 上触发事件不会冒泡到 window
- #11718: 弃用 .data() 事件
- #11719: 弃用 .bind("ready") 事件
- #11731: 弃用“hover”伪事件
- #11733: 弃用 .load()、.unload() 和 .error() 方法
- #11786: 弃用 .toggle( handler, handler, … ) 签名
操作
- #8894: 在 clone() 之后调用 appendTo() 等方法在 IE 中返回不正确的 jQuery 集合
- #10324: Clone 在 IE9 中不会复制 object 元素的 innerHTML
- #11231: Append、Prepend、After、Before 应该接受数组作为第一个参数
- #11338: .replaceWith() 和断开连接的节点的行为不一致。
- #11566: 当节点是 DocumentFragment 时,node.append 等不起作用
- #11617: 定义一个 $.parseHTML 方法来创建 HTML 片段
偏移量
- #10996: 简化 offset()
- #11823: 删除 webkitConvertPointFromNodeToPage
选择器
- #3778: 选择器匹配问题
- #5568: 选择器在 FF/IE 中对注释标签的行为不同
- #8473: 在 IE9rc 中,*[tabIndex] 也选择所有没有 tabindex 的元素
- #9400: 弃用 :text、:radio、:checkbox 等选择器扩展
- #10003: 来自 #6963 的回归/BC 中断
- #10074: 将两个 [] 选择器与 :first 连接在一起不起作用
- #10570: :text 选择器在页面上存在跨域 iframe 时,在 IE7 中会抛出错误
- #10697: Sizzle 重构
- #10809: 在 :focus 伪类解析器中使用 ".activeElement" 的错误测试
- #11109: Sizzle: Expr.relative 过早截断
- #11814: Sizzle 的基于元素的 QSA 策略(即附加临时 ID)没有考虑逗号和其他选择器分隔符
- #11826: 探索 Sizzle 中 matchesSelector 的解析缓存系统
支持
- #9385: 弃用 jQuery.browser
- #11439: 使用了 jQuery.support.parentNode,但不再定义。
- #11721: 弃用并删除 jQuery.support.boxModel 的内部使用
- #11766: 将 jQuery.support 迁移到 "不稳定" 状态
遍历
- #9800: 新方法:.addBack(取代 .andSelf)
- #11543: .has 在分离的元素上不起作用
- #11706: `.has()` 在文档片段上失败
- #11738: 删除 .closest(Array) 返回数组
未分类
- #11325: 改进 domManip/buildFragment/clean
- #11435: 删除过时的测试代码,从 .data 的返回值中删除 toJSON
- #11777: 为 jQuery 核心添加对 EditorConfig 文件的支持