八月变得更加火热,因为 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 的 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) 返回数组: 这是一个 奇怪的签名,用于旧的 .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: 标准化空集的获取器返回值。
- #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: 当 box-sizing 为 border-box 时,getWH 会错误地删除填充和边框宽度
- #11787: 删除 jQuery.curCSS
- #12088: Webkit 现在为更多 getComputedStyle 属性返回百分比
- #12148: 切换事件不会在切换时触发
数据
- #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: 在 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: Ctrl 键在 Windows 上未将 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 中不会复制 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: 使用复杂的 :not() 选择器,prevAll() 返回的结果顺序错误
- #12132: 当克隆不带父节点的 object 元素时,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 中断兼容性
- #10074: 链接两个 [] 选择器与 :first 不起作用
- #10499: :nth-child() 在 :has() 内被视为在 :has() 外
- #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 时,“最大调用堆栈大小已超出”
- #11966: 后代选择器
- #11969: 收集兄弟节点时缺少空检查
- #12054: 未捕获的 TypeError: 对象 #<HTMLDocument> 没有方法 'getAttribute'
- #12057: Sizzle 回归
- #12082: .find() POS 选择器在 1.8b2 中不再起作用
- #12153: 选择器中发生错误
支持
- #9385: 弃用 jQuery.browser
- #11163: jQuery.support.checkClone 始终为 true
- #11249: 加载 jQuery 1.7.1 时 Chrome 18 中的 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