八月份变得更热了,因为 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 重构:jQuery 的选择器引擎比以往任何时候都快,这要归功于 Timmy Willison 的重写(实际上是两次重写)。当然,现在大多数浏览器都有 querySelectorAll
,但几乎所有实现都或多或少地存在不足,导致了一条满是跨浏览器坑洼的路。Sizzle 为你铺平了这条路。此外,你可能希望使用那些有用的 jQuery 选择器扩展,比如带有复杂选择器的 :has()
或 :contains()
。哦,对了,它仍然支持 IE6/7。
动画重新构想:随着时间的推移,jQuery 中的动画代码变得有点混乱。Corey Frang 义无反顾地跳进那个沼泽,成功地消除了大多数鳄鱼,嗯,错误。大多数更改都隐藏在内部,因此现有动画应该可以正常工作(并且工作得更好)。但还有一些很棒的补充,让动画更加通用和可扩展。一个值得注意且非常酷的功能是使用 Promise 中的进度回调。我们仍在编写详细的文档,但我们确实有 一份草稿。此外,以下是一个示例,展示了新代码的运行情况:http://jsbin.com/odocid/1/edit.
自动 CSS 前缀添加:当你使用 CSS 属性时,无论是在 .css()
还是 .animate()
中,我们都会使用适合该浏览器的正确带前缀的属性(如果适用)。例如,以 .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:这是 奇怪的签名,它原本用于旧的 .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 做贡献,请了解bug tracker,并通过创建简化的测试用例来帮助我们,这些用例可以清楚地演示错误。一旦我们能够重现问题,解决方案通常并不遥远。这些测试用例将成为单元测试的基础,可以防止我们在以后的版本中更改代码时发生问题。
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: width、innerWidth、innerHeight、outerWidth、outerHeight 对隐藏父元素的“box-sizing: border-box”子元素不准确
- #10679: CSS3 供应商前缀支持
- #11004: getWH 在 box-sizing 为 border-box 时错误地删除了 padding 和 border 宽度
- #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 为 setter
- #11293: 读取空 TD 的宽度或 outerWidth 会更改列的宽度值
- #11604: 将 $(elem).width(-val) 从无操作更改为 $(elem).width(0)
- #11724: Firefox 12 中 $(document).height() 更改
效果
- #7109: 动画宽度在 webkit 上以无效宽度开始
- #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 隐藏没有被正确设置
- #12138: fadeOut 在 Chrome 上的基本 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: 在 clone() 之后调用的 appendTo() 以及类似方法在 IE 中返回错误的 jQuery 集
- #10324: 克隆在 IE9 中没有复制对象元素的 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: 具有复杂 :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 时出现 "Maximum call stack size exceeded" 错误
- #11966: 后代选择器
- #11969: 收集兄弟节点时缺少 null 检查
- #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()` 在文档片段上失败
- #11738: 删除 .closest(Array) 返回 Array