jQuery 1.8 发布

发布日期: 作者:

八月的温度又高了一点,因为 jQuery 1.8 的最终代码已经发布!您可以在 jQuery 的 CDN 获取代码

与往常一样,Google 和 Microsoft 的 CDN 也会很快提供该文件。请不要问我们什么时候会提供,我们不知道,我们也不控制这些 CDN!如果您迫不及待地想开始使用,请直接从上面的 jQuery CDN 使用我们的副本。它们是相同的代码。

我们预计不会收到关于此版本的任何错误报告,因为已经发布了多个测试版和一个发布候选版本,每个人都有充分的机会对它们进行全面测试。哈哈,这个笑话永远不会过时。我们知道,你们中太多人会在尝试使用代码之前等待最终版本。所以现在真的没有理由等待了,您可以看看是否发现了任何您之前可以报告的错误。

如果您确实发现了错误,请在 jsFiddlejsbin 上创建测试用例,并在我们的 错误追踪器 上提交错误报告。如果您不确定是否发现了错误,请在我们的 论坛 上提问。jQuery 核心 1.8.0 与最新版本的 jQuery UI (1.8.22) 和 jQuery Mobile (1.1.1) 兼容。如果您在涉及这些库的页面上报告错误,请确保更新它们。

jQuery 1.8 的快速概览

让我们快速回顾一下此版本的重大变化

Sizzle 架构重构:由于 Timmy Willison 的重写(实际上是两次重写),jQuery 的选择器引擎比以往任何时候都快。当然,大多数浏览器现在都有 querySelectorAll,但几乎所有实现都在某方面有所欠缺,造成了跨浏览器问题。Sizzle 为您平滑了这条道路。此外,您可能需要那些有用的 jQuery 选择器扩展,例如带复杂选择器的 :has():contains()。哦,对了,它仍然支持 IE6/7。

动画重新设计:随着时间的推移,jQuery 中的动画代码变得有些混乱。Corey Frang 勇敢地跳进了这个沼泽,设法去除了大部分的鳄鱼,呃,错误。大多数更改都在底层,因此现有动画应该可以正常工作(并且工作得更好)。但也有一些很棒的补充,使动画更加通用和可扩展。一个值得注意的非常酷的特性是使用 Promise 中的进度回调。我们仍在编写详细的文档,但我们确实有 草案。另外,这是一个新代码运行的示例:http://jsbin.com/odocid/1/edit.

自动 CSS 前缀:当您在 .css().animate() 中使用 CSS 属性时,我们会为该浏览器使用正确的带前缀的属性(如果适用)。例如,以 .css("user-select", "none") 为例;在 Chrome/Safari 中,我们会将值设置为 "-webkit-user-select",Firefox 将使用 "-moz-user-select",IE10 将使用 "-ms-user-select"

使用 $(html, props) 更加灵活:在 jQuery 1.8 中,您可以在传递给 $(html, props) 的对象中使用任何 jQuery 方法或插件。之前,您只能使用一小部分方法名称,并且没有记录添加新方法的方式。现在根本不需要列表!但是请注意,如果稍后添加了与 HTML 属性同名的插件,这可能会导致代码的行为发生改变。

修复了超过 160 个错误:特别是 Sizzle 和动画的重写为修复一些长期存在的错误提供了动力,其中一些错误已经存在了两三年。Mike Sherov 解决了大部分未解决的 CSS 和定位问题,使我们在这方面的错误数量降至几乎为零。我们也没有放弃,还在努力消除 IE 6/7/8 和现代浏览器之间的烦人差异,因此您无需处理这些差异。

更小的代码大小:尽管进行了所有代码清理、新功能和错误修复,但 jQuery 1.8 的 gzip 压缩文件大小实际上比 jQuery 1.7.2 小几百字节。缩减大小并不是我们在这个版本的首要目标,但我们认为控制代码增长很重要,而且我们确实做到了。非常感谢 Richard Gibson 领导了整个项目的代码压缩工作。

模块化:如果您了解项目的 jQuery 依赖项,则可以使用新的 grunt 基于构建系统去除您知道不需要的 jQuery 部分。我们在这里为 1.8 所做的事情只是一个开始,在迁移到更高版本时,您将看到更大的灵活性。

如果您想知道自己喜欢的错误是否已修复,可以在下面查看完整的更改日志。

已删除的内容

简而言之,"很少"。我们希望为将在 1.9 中删除的已弃用功能提供充足的通知期限,以便人们有时间调整代码。在 1.8 中删除的几个内容是未记录的内部内容,有些人巧妙地反向工程了它们,但始终要谨慎使用未记录的功能。以下是删除的内容

$(element).data(“events”): 在 1.6 版本中,jQuery 将其内部数据与其用户数据分离,以防止命名冲突。但是,有些人使用未记录的内部 “events” 数据结构,因此我们使其可以通过 .data() 检索。现在已在 1.8 中删除,但您仍然可以通过 $._data(element, "events") 获取事件数据以进行调试。请注意,这不是受支持的公共接口;实际的数据结构可能会在不同版本之间发生不兼容的更改。

Deferred.isResolved() 和 Deferred.isRejected(): 调用 N-1 个布尔方法来获取 N 状态变量的状态有点愚蠢,因此我们在 jQuery 1.7 中添加了 Deferred.state(),以便您在一个调用中了解状态。因此,这两个旧方法不再需要。对于您经常需要以字符串形式了解 Deferred 状态的调试场景来说,这要方便得多。

$(element).closest(Array) 返回 Array: 这是 奇怪的签名.closest() 方法,它旨在供旧的 .live() 使用,但据我们所知,其他代码没有使用。.closest() 返回 jQuery 对象的正常使用不受此签名删除的影响。

$.curCSS: 此方法从 jQuery 1.3 开始只是 jQuery.css() 的别名。尽管它从未是文档化的 API 的一部分,但已知一些外部代码使用它,可能认为它“更有效”。现在它“更消失了”。

$.attrFn: 另一个未记录的项目,用于定义哪些方法可以与 $(html, props) 签名一起使用。尽管它在 jQuery 1.8 中没有功能作用,但我们在 jQuery 中保留了一个 $.attrFn,以防止使用它的代码抛出错误。警告:此项目将在 jQuery 1.9 中完全删除,因此请更新您的代码!

致谢

如果没有才华横溢的 jQuery 核心团队的辛勤工作,这个版本将无法发布:Julian Aubourg (jaubourg)、Corey Frang (gnarf)、Richard Gibson (gibson042)、Mike Sherov (mikesherov)、Rick Waldron (rwaldron) 和 Timmy Willison (timmywil)。

特别感谢以下 jQuery 团队和社区成员,他们在 jQuery 1.8 开发周期中通过补丁贡献为核心团队提供了支持:Andy Monat、Robert Katic、Joaoh Bruni、Sindre Sorhus、Oleg Gaidarenko、Yehuda Katz、Timo Tijhof、Dominik D. Geyer、Scott González、Jörn Zaefferer、Matt Farmer、Trey Hunner、Jason Moon、Ben Alman、Jeffery To、Kris Borchers、Daniel Herman、Vladimir Zhuravlev、Jacob Thornton、Chad Killingsworth、Nowres Rafid、David Benjamin、Uri Gilad、Chris Faulkner、Elijah Manor 和 Daniel Chatfield。

我们也衷心感谢所有花时间报告错误的人;我们不可能修复错误,除非我们知道它的存在。如果您想轻松地为 jQuery 做贡献,请了解 错误追踪器,并通过创建简化的测试用例来帮助我们,这些测试用例可以清楚地展示错误。一旦我们能够重现问题,解决方案通常就不远了。这些测试用例成为单元测试的基础,可以防止我们在以后的修订中更改代码时出现问题。

jQuery 1.8 更改日志

Ajax

  • #8205: JSONP 随机结果导致 IE8 出现内存泄漏
  • #8653: jQuery.param 在查询字符串中输出 "null" 和 "undefined"
  • #9399: 弃用 jqXHR.success 和 jqXHR.error
  • #10285: evalScript rcleanScript 替换在 IE8 中失败
  • #10524: jQuery.fn.load 未将数据参数与 jQuery.ajaxSetup 合并
  • #10944: $.ajax 并不总是返回实现 Promise 接口的对象
  • #11013: 弃用与同步 $.ajax 一起使用 Deferred/Promise
  • #11402: evalScript 函数在 IE 中出现错误 error 80020101
  • #11743: jQuery 在 $.appendTo() 中脚本标签 ajax 请求期间静默地忽略错误
  • #11778: 缓存的 XHR 请求仍应异步解析
  • #12122: jQuery.ajax() 异步弃用与 $.Deferred 一起使用

属性

  • #11153: jQuery 1.7 在 IE 8 中删除回车符
  • #11212: Sizzle.getText 将不可分割的空格转换为 IE 中的空白符
  • #11547: XML DOM .removeAttr() 未删除带大小写字母的属性
  • #11962: 标准化空集的获取器返回值。
  • #12127: 克隆在 IE10 中未正确复制选中状态

构建

  • #11767: 支持没有效果的自定义构建
  • #11789: 更新 README 以描述 grunt 构建系统
  • #11856: 将尺寸模块化
  • #11857: 将 css 模块化
  • #11865: 将 offset 模块化
  • #11965: 创建 deprecated.js 以包含尽可能多的已弃用内容
  • #12059: `grunt custom` 应该进行压缩 - 同时应该将排除的模块添加到头部
  • #12158: jQuery 1.8rc1 不兼容 YUICompressor 1.4.7

核心

  • #10657: 将 jQuery#size() 弃用,建议使用 jQuery#length
  • #11290: 选择器被解释为 HTML
  • #11470: 添加内置的 readyP promise
  • #12018: $(document).ready() 在 IE8 中过早触发
  • #12026: 允许 $(html, props) 使用任何 jQuery.fn 方法

CSS

  • #10373: `document.defaultView` => `window`
  • #10394: jQuery.cssHooks.opacity 在非 IE 浏览器上抛出异常
  • #10413: 对于隐藏父元素的 “box-sizing: border-box” 子元素,width、innerWidth、innerHeight、outerWidth、outerHeight 不准确
  • #10679: CSS3 供应商前缀支持
  • #11004: 当 box-sizing 为 border-box 时,getWH 错误地去除了内边距和边框宽度
  • #11787: 移除 jQuery.curCSS
  • #12088: Webkit 现在返回更多 getComputedStyle 属性的百分比
  • #12148: 切换时,hide 事件不会触发

数据

  • #7579: jQuery.data() 截断了从 data-xxx 属性获取的数字
  • #10589: 移除 $.fn.data("events")
  • #11435: 删除过时的测试代码,以从 .data 的返回值中移除 toJSON

延迟

  • #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 的 width 或 outerWidth 会改变列的宽度值
  • #11604: 将 $(elem).width(-val) 从无操作更改为 $(elem).width(0)
  • #11724: Firefox 12 中 $(document).height() 发生了改变

效果

  • #7109: 在 Webkit 上,animate 宽度从无效宽度开始
  • #7157: 动画回调显示元素仍然是 “:animated”
  • #8387: jQuery 1.5 中 hide/show 与 Webkit 浏览器上的内联和内联块元素存在闪烁问题
  • #8627: .animate() 在 IE 上对 letterSpacing 失败(1.5.1 版本中的回归)
  • #8892: 在使用 fadeIn() 和 jQuery.fx.off = true 时,回调在对象显示之前触发
  • #9217: 在 IE8 中,当动画元素在动画结束之前被移除时,出现 JavaScript 错误
  • #9505: 在 WebKit 中,当在百分比和像素之间混合使用时,animate() 出现问题
  • #11635: 显式 overflow:auto 在动画期间被内联 overflow:hidden 覆盖
  • #11755: animate 及其别名不应该使用 :hidden 选择器
  • #11797: 与动画相关的全新事件
  • #11854: 百分比动画跳到末尾
  • #11971: 在 IE8 中,动画 background-position 失败
  • #11999: 在固定 div 上进行增量动画时,Chrome 会执行减法而不是加法。
  • #12117: 当动画到 0 高度或宽度时,overflow hidden 设置不正确
  • #12138: 在 Chrome 上,fadeOut 无法在基本 SVG 元素上运行
  • #12150: 当行显示和隐藏时,border-spacing 属性累积

事件

  • #8545: 在 IE 中,事件存在泄漏
  • #10067: 在 document.readyState === 'interactive' 时也触发 $.ready
  • #10895: bindReady 中的 doScrollCheck ie 技巧毫无理由地降低了 ie7 的性能
  • #11101: 从 trigger 方法中弃用 “exclusive” 事件选项
  • #11315: delegate() 和 :first 在具有等效类的嵌套元素中存在问题
  • #11328: 在 Windows 上,Ctrl 键不会将 event.metaKey 设置为 true
  • #11382: mouseenter 不会在禁用的输入元素上触发
  • #11500: 错误:在 IE7 和 IE8 上,当手动触发时,不会执行 “change” 事件处理程序
  • #11621: 在 document 上触发事件不会冒泡到 window
  • #11718: 弃用 .data() 事件
  • #11719: 弃用 .bind("ready") 事件
  • #11731: 弃用 “hover” 伪事件
  • #11733: 弃用 .load()、.unload() 和 .error() 方法
  • #11764: 允许在禁用的元素上委托非原生事件
  • #11786: 弃用 .toggle( handler, handler, … ) 签名
  • #12203: .undelegate() 不带参数会取消绑定父元素上的所有处理程序

操作

  • #8894: 在 IE 中,appendTo() 及其类似方法在调用 clone() 之后返回的 jQuery 集合不正确
  • #10324: 在 IE9 中,Clone 不会复制对象元素的 innerHTML
  • #11231: Append、Prepend、After、Before 应该接受数组作为第一个参数
  • #11325: 改善 domManip/buildFragment/clean
  • #11338: .replaceWith() 和断开连接的节点存在不一致的行为。
  • #11528: ie8 序列化错误,.html() 也影响 html5 标签
  • #11566: 当节点是 DocumentFragment 时,node.append 等不起作用
  • #11617: 定义一个 $.parseHTML 方法来创建 HTML 片段
  • #11809: .text(val) 设置器中的内存泄漏?
  • #11898: 使用复杂的 :not() 选择器,prevAll() 会以错误的顺序返回结果
  • #12132: 在 IE10 中,克隆没有父节点的对象元素时出现错误

偏移

  • #10996: 简化 offset()
  • #11823: 移除 webkitConvertPointFromNodeToPage

选择器

  • #3778: 选择器匹配问题
  • #5568: 在 FF/IE 上,选择器在处理注释标签时的行为不同
  • #7596: xpath 选择器属性名带方括号 [] 失败
  • #8473: 在 IE9rc 中,*[tabIndex] 会选择所有没有 tabindex 的元素
  • #8906: .(prevAll('span:has(input,select,textarea)')
  • #9400: 弃用 :text、:radio、:checkbox 等选择器扩展
  • #9810: 重写位置选择器逻辑
  • #10003: 来自 #6963 的回归/BC 问题
  • #10074: 链接两个 [] 选择器,:first 不起作用
  • #10499: :has() 中的 :nth-child() 被当作在 :has() 外部一样处理
  • #10570: 当页面上存在跨域 iframe 时,:text 选择器在 IE7 中抛出错误
  • #10697: Sizzle 重构
  • #10799: 使用 [name="name"] 选择器时,结果不一致(也破坏了 .has)
  • #10809: 在 :focus 伪类解析器中,使用 “.activeElement” 的错误测试
  • #11109: Sizzle: Expr.relative 过早截断
  • #11120: 在 IE7 中,一些选择器中的制表符会失效
  • #11814: Sizzle 的元素根 QSA 策略(即附加临时 ID)没有考虑逗号和其他选择器分隔符
  • #11826: 探索 Sizzle 中 matchesSelector 的解析缓存系统
  • #11902: :not + :contains 选择器
  • #11918: 使用带 “:” 的标签名时,:eq 选择器出现问题
  • #11959: 添加对 :active 选择器的支持
  • #11961: 使用 jQuery#is 时,“最大调用堆栈大小超出”
  • #11966: 后代选择器
  • #11969: 收集兄弟节点时缺少空值检查
  • #12054: 未捕获的 TypeError: 对象 #<HTMLDocument> 没有方法 'getAttribute'
  • #12057: Sizzle 回归
  • #12082: .find() POS 选择器在 1.8b2 中不再起作用
  • #12153: 选择器中出现错误

支持

  • #9385: 弃用 jQuery.browser
  • #11163: jQuery.support.checkClone 始终为 true
  • #11249: Chrome 18 中加载 jQuery 1.7.1 时出现 CSP 错误
  • #11439: 使用了 jQuery.support.parentNode,但它不再定义。
  • #11721: 弃用并移除对 jQuery.support.boxModel 的内部使用
  • #11757: 在包含 jQuery 1.7.2 的 iframe 中,IE 8 出现内存累积
  • #11766: 将 jQuery.support 更改为 “不稳定” 状态

遍历

  • #9800: 新方法:.addBack(取代 .andSelf)
  • #11539: 所有版本的 jQuery 都不支持在 $([text Element].parentNode).has?(other_element) 上使用 .has()
  • #11543: .has 无法在分离的元素上运行
  • #11706: `.has()` 在 DocumentFragment 上失败
  • #11738: 移除 .closest(Array) 返回 Array

关于 “jQuery 1.8 发布” 的 59 条评论

  1. 我很高兴也很自豪地说,这是我最喜欢的博客。帖子非常独特,而且新创意和卓越的表现令人惊叹,新的想法和理念也十分出色。

  2. 你好,
    我是 jQuery Mobile 的新手,请帮帮我。
    请给我一些关于如何使用 jQuery Mobile 的建议。
    谢谢