八月变得更加火热,因为 jQuery 1.8 最终代码已经发布!您可以从 jQuery 的 CDN 获取代码
像往常一样,Google 和 Microsoft 的 CDN 也会很快提供该文件。请不要问我们什么时候会有,我们不知道,而且我们无法控制这些 CDN!如果您只是迫不及待地想开始使用,请直接使用来自 jQuery CDN 的副本。它们是相同的代码。
我们预计不会收到关于此版本的任何错误报告,因为已经有几个 beta 版本和一个发布候选版本,每个人都有足够的机会彻底测试。哈哈,这个笑话永远不会过时。我们知道,太多的人会等到最终版本发布后才开始用他们的代码进行测试。所以现在真的没有理由等待了,您可以发现是否有任何您本可以提前报告的错误。
如果您发现错误,请在 jsFiddle 或 jsbin 上创建一个测试用例,并在我们的 错误跟踪器 上提交错误。如果您不确定是否发现错误,请在我们的 论坛 上提问。jQuery core 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() 的正常用法不受此签名删除的影响。
$.curCSS:此方法只是从 jQuery 1.3 开始的 jQuery.css() 的别名。虽然它从未成为记录的 API 的一部分,但一些外部代码已知会使用它,也许认为它“更有效”。现在它“更消失了”。
$.attrFn:另一个未记录的项目,用于定义哪些方法可以与 $(html, props) 签名一起使用。虽然它在 jQuery 1.8 中没有功能,但我们留下了一个空的 $.attrFn 在 jQuery 中,以防止使用它的代码抛出错误。警告:它将在 jQuery 1.9 中完全删除,因此请更新您的代码!
功劳归于
如果没有 jQuery Core 团队的辛勤工作,这次发布将无法实现:Julian Aubourg (jaubourg)、Corey Frang (gnarf)、Richard Gibson (gibson042)、Mike Sherov (mikesherov)、Rick Waldron (rwaldron) 和 Timmy Willison (timmywil)。
特别感谢这些 jQuery 团队和社区成员,他们在 jQuery 1.8 开发周期内通过补丁贡献支持了 Core 团队: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 不会将 data 参数与 jQuery.ajaxSetup 合并
- #10944: $.ajax 并不总是返回实现 Promise 接口的对象
- #11013:弃用在同步 $.ajax 中使用 Deferred/Promise
- #11402: evalScript 函数在 IE 中出现错误 80020101
- #11743: jQuery 在 $.appendTo() 中对 script 标签 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: width、innerWidth、innerHeight、outerWidth、outerHeight 对于 box-sizing: border-box 的隐藏父元素的子元素不准确
- #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: 在 $.when() 中传递多个 Deferred 对象时保留上下文对象
Dimensions
- #6724: 在移动 Safari (iPhone) 中 $(window).height() 错误
- #10877: 使 outerWidth/Height 成为 setter
- #11293: 读取空 TD 的宽度或 outerWidth 会改变列的宽度值
- #11604: 将 $(elem).width(-val) 从无操作更改为 $(elem).width(0)
- #11724: Firefox 12 中 $(document).height() 已更改
Effects
- #7109: animate width 在 WebKit 中以无效宽度开始
- #7157: 动画回调显示元素仍然为“:animated”
- #8387: 使用 WebKit 中的内联和内联块元素时,hide/show 问题导致闪烁
- #8627: .animate() 在 IE 中对 letterSpacing 失败(1.5.1 中的回归)
- #8892: 在 clone() 之后调用 appendTo() 和类似方法返回错误的 jQuery 集合
- #9217:在动画完成前移除元素时,IE8 中出现 javascript 错误
- #9505: 在 WebKit 中混合百分比和像素时出现 animate() 问题
- #11635: 动画期间显式 overflow:auto 被内联 overflow:hidden 覆盖
- #11755: animate 及其别名不应使用 :hidden 选择器
- #11797:新的动画相关事件
- #11854: 百分比动画跳转到结束
- #11971:在 IE8 中动画 background-position 失败
- #11999:在 Chrome 中对固定 div 进行增量动画时,执行减法而不是加法。
- #12117:动画到 0 高度或宽度时,overflow hidden 未正确设置
- #12138:fadeOut 在 Chrome 中对基本的 SVG 元素不起作用
- #12150:当行显示和隐藏时,border-spacing 属性会累积
事件
- #8545: IE 中存在泄漏事件
- #10067: 在 document.readyState === 'interactive' 时触发 $.ready
- #10895:bindReady 中的 doScrollCheck ie hack 毫无理由地降低了 ie7 的性能
- #11101: 弃用 trigger 方法中的“exclusive”事件选项
- #11315:delegate() 和 :first 在具有等效类别的嵌套元素中存在问题
- #11328: 在 Windows 上 Ctrl 键不会将 event.metaKey 设置为 true
- #11382:鼠标进入事件在禁用的输入元素上无法触发
- #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: 在 clone() 之后调用 appendTo() 和类似方法返回错误的 jQuery 集合
- #10324: Clone 不会复制 object 元素的 innerHTML
- #11231:Append、Prepend、After、Before 方法应接受数组作为第一个参数
- #11325:改进 domManip/buildFragment/clean
- #11338:.replaceWith() 和断开连接的节点行为不一致。
- #11528:ie8 .html() 序列化错误也影响 html5 标签
- #11566:node.append 等方法在节点是 DocumentFragment 时不起作用
- #11617:定义一个 $.parseHTML 方法用于创建 HTML 片段
- #11809:.text(val) setter 中存在内存泄漏?
- #11898:prevAll() 带有复杂的 :not() 选择器返回结果顺序错误
- #12132:IE10 错误:克隆没有父节点的 object 元素
Offset
- #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::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:IE 8 在使用 jQuery 1.7.2 的 iframe 中出现内存累积
- #11766:将 jQuery.support 移动到“不稳定”状态
Traversing
- #9800:新方法:.addBack(取代 .andSelf)
- #11539:所有版本的 jQuery 不支持在 $([text Element].parentNode).has?(other_element) 上使用 .has()
- #11543:.has 在分离的元素上不起作用
- #11706:`.has()` 在文档片段上失败
- #11738:移除 .closest(Array) 返回 Array