各位 jQuery 用户大家好!我们已经有一段时间没有跟大家联系了,但我们一直都在努力工作。jQuery 核心团队一直在埋头开发 jQuery 1.8,现在我们的第一个测试版发布了!您可以从 jQuery CDN 获取代码
在您当前的 jQuery 代码上试一试,并告诉我们它是否符合您的预期。如果您遇到问题,请提交 Bug,包含测试用例,并确保您提到您正在针对 jQuery 1.8 Beta 1 进行测试。
本月晚些时候,在旧金山举行的jQuery 大会上,将会有更多激动人心的 jQuery 新闻发布,之后还会有博客文章。
jQuery 现在为互联网上大约一半的主要网站提供动力;这是一个巨大的成功,但我们并没有止步不前。在过去的六年里,网络浏览器及其运行的设备经历了惊人的转变。网络开发流程正在不断发展,以适应正在发生的改变。作为回应,jQuery 也在不断发展。
这种演变的一部分不仅是了解要添加什么,还要了解要删除什么。jQuery 的插件架构使开发人员能够轻松地扩展 jQuery Core 提供的功能,如果这对于他们的需求有意义的话。因此,对核心添加的功能设置了相当高的标准。我们不想为不需要特定功能的人创建大小、复杂度或性能方面的负担。
同样,我们对人们使用 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 字符串将不再被 $()
识别为 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 版本中还有许多其他更改,也许最简单的方法是查看我们正在解决的 issue 列表,其中包括功能和错误修复。以下是对 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 中失败,并出现错误 error 80020101
- #11743:jQuery 在 $.appendTo() 中的脚本标签 ajax 请求期间静默忽略错误
- #11778:缓存的 XHR 请求仍应异步解析
属性
构建
- #11767: 支持自定义构建,不含效果
- #11789: 更新 README 以描述 Grunt 构建系统
- #11856: 将尺寸模块化
- #11857: 将 CSS 模块化
- #11865: 将偏移量模块化
核心
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 成为一个设置器
- #11293: 读取空 TD 的宽度或 outerWidth 会改变列宽的值
- #11604: 将 $(elem).width(-val) 从无操作更改为 $(elem).width(0)
- #11724: 在 Firefox 12 中,$(document).height() 发生了改变
效果
- #7109: 在 WebKit 中,animate 宽度以无效宽度开始
- #7157: 动画回调显示元素仍然是 ":animated"
- #8387: 在 WebKit 浏览器中,jQuery 1.5 的 hide/show 与内联和内联块元素存在闪烁问题
- #8627: 在 IE 中,.animate() 对 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: Bug: 在 IE7 & IE8 中,当手动触发 "change" 事件处理程序时,它不会执行
- #11621: 在 document 上触发事件不会冒泡到 window
- #11718: 弃用 .data() 事件
- #11719: 弃用 .bind("ready") 事件
- #11731: 弃用 "hover" 伪事件
- #11733: 弃用 .load()、.unload() 和 .error() 方法
- #11786: 弃用 .toggle( handler, handler, … ) 签名
操作
- #8894: 在 IE 中,appendTo() 及其类似方法在调用 clone() 之后返回不正确的 jQuery 集
- #10324: 在 IE9 中,Clone 不会复制 object 元素的 innerHTML
- #11231: Append、Prepend、After、Before 应该接受数组作为第一个参数
- #11338: .replaceWith() 和断开连接的节点存在不一致的行为
- #11566: 当节点是 DocumentFragment 时,node.append 等不起作用
- #11617: 定义一个 $.parseHTML 方法用于创建 HTML 片段
偏移量
选择器
- #3778: 选择器匹配问题
- #5568: 在 FF/IE 中,选择器在带有注释标签时的行为不同
- #8473: 在 IE9rc 中,*[tabIndex] 会选择所有没有 tabindex 的元素
- #9400: 弃用 :text、:radio、:checkbox 等选择器扩展
- #10003: 来自 #6963 的回归/向后兼容性破坏
- #10074: 将两个 [] 选择器与 :first 连接不起作用
- #10570: 当页面上存在跨域 iframe 时,:text 选择器在 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()` 在 document 片段上失败
- #11738: 移除 .closest(Array) 返回 Array