各位 jQuery 用户大家好!自从您上次收到我们的消息已经有一段时间了,但我们并没有睡着。jQuery 核心团队一直埋头工作,开发 jQuery 1.8,现在我们的第一个测试版已经发布!您可以在 jQuery CDN 上获取代码
在您的当前 jQuery 代码上试用它,并告诉我们它的运行情况。如果您遇到问题,请提交错误报告,包括一个测试用例,并确保您提到了您正在针对 jQuery 1.8 Beta 1 进行测试。
本月晚些时候在旧金山举行的jQuery 大会上将会有更多激动人心的 jQuery 消息,随后会有博文发布。
jQuery 现在为互联网上大约一半的主要网站提供支持;这是一个巨大的成功,但我们并没有止步不前。在过去的六年里,网络浏览器和它们运行的设备经历了惊人的蜕变。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 中,我们希望我们已经控制住了这个怪物。但这不仅仅是清理,它还包含几个扩展点,使得添加或修改动画变得更容易。目前,针对新功能的文档还处于初步阶段,但在第一个测试版中,我们的主要重点将是确保任何现有的动画代码都能正常工作。
如今,浏览器在提供高效的动画方面做得越来越好,特别是使用 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 事件: 像 ajaxStart
这样的事件由 $.ajax
触发,当前可以附加到任何元素 - 甚至那些不在文档中的元素!这会创建一种低效的特殊情况,因此我们将在 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() 中的 script 标签 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")
Deferred
- #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: 在 WebKit 中,animate width 从无效宽度开始
- #7157: 动画回调显示元素仍然是“:animated”
- #8387: jQuery 1.5 中,在 WebKit 浏览器上,使用内联和内联块元素进行 hide/show 操作时出现闪烁问题
- #8627: .animate() 在 IE 上的 letterSpacing 失败(1.5.1 中的回归)
- #8892: 当 jQuery.fx.off = true 时,在使用 fadeIn() 显示对象之前,回调被触发
- #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: 错误:“change”事件处理程序在 IE7 和 IE8 中手动触发时没有执行
- #11621: 在 document 上触发事件不会冒泡到 window
- #11718: 过时移除 .data() 事件
- #11719: 过时移除 .bind("ready") 事件
- #11731: 过时移除“hover”伪事件
- #11733: 过时移除 .load()、.unload() 和 .error() 方法
- #11786: 过时移除 .toggle( handler, handler, … ) 签名
操作
- #8894: 在 IE 中,clone() 后调用 appendTo() 等方法会返回不正确的 jQuery 集合
- #10324: 在 IE9 中,Clone 不会复制对象元素的 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 选择器在 IE7 中出现错误,当页面上有一个跨域 iframe 时
- #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() 在 document 片段上失败
- #11738: 移除 .closest(Array) 返回数组的行为
未分类
- #11325: 改善 domManip/buildFragment/clean
- #11435: 移除过时的测试代码,从 .data 的返回值中删除 toJSON
- #11777: 为 jQuery 核心添加对 EditorConfig 文件的支持