8 月变得更加火热,因为 jQuery 1.8 最终代码已经发布!你可以在 jQuery 的 CDN 上获取代码
像往常一样,Google 和 Microsoft CDN 也会很快拥有该文件。请不要询问我们何时可以获取,我们不知道,我们也不控制这些 CDN!如果你迫不及待想开始使用,请直接使用上面 jQuery CDN 中的副本。它们是一样的。
我们预计不会收到关于此版本的任何错误报告,因为已经发布了几个测试版和一个发布候选版本,每个人都有充分的机会对其进行全面测试。哈哈,这个笑话永远不会过时。我们知道你们中太多人会等到最终版本发布才会尝试将它用于自己的代码。所以现在真的没有理由等待,你可以看看是否有任何你可以提前报告的错误。
如果你确实发现了错误,请在 jsFiddle 或 jsbin 上创建一个测试用例,并在我们的 错误跟踪器 上提交一个错误。如果你不确定是否发现了错误,请在我们的 论坛 上提问。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 的压缩文件大小实际上比 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: 弃用使用 Deferred/Promise 与同步 $.ajax
- #11402: evalScript 函数在 IE 中出现错误 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: 为空集标准化 getter 返回值。
- #12127: 克隆在 IE10 中无法正确复制选中状态
构建
核心
- #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: getWH 在 box-sizing 为 border-box 时错误地删除了填充和边框宽度
- #11787: 删除 jQuery.curCSS
- #12088: Webkit 现在为更多 getComputedStyle 属性返回百分比
- #12148: hide 事件在切换时不会触发
数据
- #7579: jQuery.data() 截断从 data-xxx 属性获取的数字
- #10589: 删除 $.fn.data("events")
- #11435: 删除过时的测试代码,以从 .data 的返回值中删除 toJSON
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) 从 no-op 切换为 $(elem).width(0)
- #11724: $(document).height() 在 Firefox 12 中发生了改变
效果
- #7109: 在 webkit 上,animate 宽度以无效宽度开始
- #7157: 动画回调显示元素仍然是 ":animated"
- #8387: 在 webkit 浏览器上,使用 jQuery 1.5 hide/show 对内联和内联块元素进行动画处理时,出现闪烁问题
- #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 属性会累积
Event
- #8545: IE 中的事件出现泄漏
- #10067: 在 document.readyState === 'interactive' 时也触发 $.ready
- #10895: bindReady 中的 doScrollCheck ie 技巧毫无理由地降低了 ie7 性能
- #11101: 从 trigger 方法中弃用 "exclusive" 事件选项
- #11315: delegate() 和 :first 在具有等效类的嵌套元素中出现问题
- #11328: Ctrl 键在 Windows 上不会将 event.metaKey 设置为 true
- #11382: Mouseenter 在禁用的输入元素上不会触发
- #11500: 错误:"change" 事件处理程序在 IE7 和 IE8 中手动触发时没有执行
- #11621: 在 document 上触发事件不会冒泡到 window
- #11718: 弃用 .data() 事件
- #11719: 弃用 .bind("ready") 事件
- #11731: 弃用 "hover" 伪事件
- #11733: 弃用 .load()、.unload() 和 .error() 方法
- #11764: 允许在禁用的元素上委托非原生事件
- #11786: 弃用 .toggle( handler, handler, … ) 签名
- #12203: .undelegate() 不带任何参数会从父元素中取消绑定所有处理程序
操作
- #8894: 在 IE 中,clone() 之后调用的 appendTo() 等方法返回不正确的 jQuery 集
- #10324: 克隆在 IE9 中不会复制 object 元素的 innerHTML
- #11231: Append、Prepend、After、Before 应该接受数组作为第一个参数
- #11325: 改进 domManip/buildFragment/clean
- #11338: .replaceWith() 和断开连接的节点的行为不一致。
- #11528: ie8 序列化错误,.html() 也影响 html5 标签
- #11566: node.append 等在 node 是 DocumentFragment 时不起作用
- #11617: 定义一个 $.parseHTML 方法来创建 HTML 片段
- #11809: .text(val) setter 出现内存泄漏?
- #11898: prevAll() 使用复杂的 :not() 选择器会以错误的顺序返回结果
- #12132: 在 IE10 中,克隆没有父节点的 object 元素时出现错误
Offset
- #10996: 简化 offset()
- #11823: 删除 webkitConvertPointFromNodeToPage
Selector
- #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() 被视为外部
- #10570: :text 选择器在页面上存在跨域 iframe 时在 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 时出现“Maximum call stack size exceeded”错误
- #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 移至“不稳定”状态
Traversing
- #9800: 新方法:.addBack(取代 .andSelf)
- #11539: 所有版本的 jQuery 都不支持 $([text Element].parentNode).has?(other_element) 上的 .has()
- #11543: .has 在分离的元素上不起作用
- #11706: `.has()` 在文档片段上失败
- #11738: 删除返回数组的 .closest(Array)