关于 Dave Methvin

首席技术官,PC Pitstop http://pcpitstop.com

jQuery Core:版本 1.9 及以后

发布于 作者

请查看 后续文章,避免得出错误的结论。

正如上一篇博客文章所讨论的,jQuery 版本 1.8 正在进行春季大扫除,以删除不安全、效率低下、无效和不可取的功能。我们还开始着手允许您构建自定义版本,这些版本会排除库的某些部分,从而实现更大的节省。这些努力将使您能够在不需要的情况下使用所需的 jQuery API,而无需携带不需要的部分。

现在我们已经清理了房屋,是时候展望未来了。只有一件事阻碍了我们对未来的愿景,那就是过去的浏览器幽灵。Internet Explorer 6、7 和 8(统称为 oldIE)十多年来一直是 Web 开发人员的眼中钉。总的来说,这些过时时代的浏览器仍然代表了访问某些网站的用户的三分之一。这是一大批用户——仍然希望获得网站提供的资讯、服务和产品的人。对于许多使用 jQuery 的网站来说,忽略这些受众是不切实际或不盈利的。

jQuery 的诞生是为了解决浏览器之间的差异,所以我们不会放弃我们理念的本质,也不会简单地无视仍然使用 oldIE 的数百万活跃互联网用户(无论出于何种原因)。但我们也希望前进并利用现代浏览器,尤其是不断增长的移动市场。

前进之路

jQuery 1.8 应该在一个月内发布。以下是我们对接下来的两个 jQuery 版本的思考,以及它们的发布时间。

  • jQuery 1.9(2013 年初):我们将删除 1.8 版本中已弃用的许多接口;其中一些将作为插件或 jQuery 项目支持的替代 API 提供。将像今天一样支持 IE 6/7/8。
  • jQuery 1.9.x(2013 年及以后持续进行):此版本将继续修复任何回归问题、新的浏览器错误等。
  • jQuery 2.0(2013 年初,紧随 1.9 版本之后):此版本将支持与 jQuery 1.9 相同的 API,但会删除对 IE 6/7/8 特性的支持,例如错误的事件模型、IE7 的“属性”、HTML5 垫片等。

我们的目标是使 1.9 和 2.0 在其支持的 API 集方面可以互换使用。当 2.0 发布时,您应该做出简单的决定:如果您需要 IE 6/7/8 支持,请选择 1.9;否则,您可以使用 1.9 或 2.0。

问题与解答

如果 jQuery 1.9 和 2.0 基本上是相同的 API,那么是什么让 2.0 更具吸引力?更小的尺寸、更好的性能以及没有由于需要 oldIE 支持而带来的问题。例如,我们预计可以在 2.0 中改进 $.Deferred 实现中的错误处理,而只要支持 oldIE,我们就无法做到这一点。

我的网站仍然有很多 IE7/8 访问者,但我想要使用 jQuery 2.0。我可以这样做吗?如果您的网站需要 oldIE 支持,我们预计大多数网站至少在未来一两年内都需要支持,您可以使用 IE 条件注释仅在访问者使用 oldIE 时包含 1.9 版本。

<!--[if lt IE 9]>
    <script src="jquery-1.9.0.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
    <script src="jquery-2.0.0.js"></script>
<!--<![endif]-->

为什么不为 jQuery 2.0 创建一个“oldIE 插件”?jQuery 中到处都散布着针对 oldIE 的特殊例外。重构代码以提供足够的挂钩,以便可以将 oldIE 支持添加为插件,这会使现代浏览器情况下的代码变得更加复杂。此外,支持 oldIE 并使用公共 CDN 的开发人员需要包含两个文件(jQuery 2.0 和 oldIE 插件),而不是一个。

jQuery 2.0 发布后,1.9 会怎么样?与过去不同的是,我们将继续修复 1.9 中的错误(作为次要版本)。在完成了 1.8 和 1.9 的春季大扫除后,我们预计未来不会添加很多新的 API。相反,我们更愿意通过与这两个版本兼容的插件来添加新功能,只要有意义。因此,不要觉得使用 1.9 版本就落后了。

jQuery 2.0 基本上是为移动设备设计的吗?不。虽然 jQuery 2.0 非常适合 HTML 移动应用程序,包括使用 jQuery Mobile 编写的应用程序,但它不是仅针对 iOS 和 Android 的 Webkit 专用库。除了移动浏览器外,2.0 还将支持(并经过测试!)Internet Explorer、Opera、Firefox、Safari 和 Chrome 的现代桌面版本。

jQuery 2.0 会小多少/快多少?在我们完成之前,或者至少接近完成之前,我们还不知道。您可以相信,随着 2.0 的发布日期临近,我们会告诉您更多信息。更好的是,您可以尝试测试版,并亲眼看看!

jQuery 1.8 Beta 1:了解即将发布的功能(以及即将删除的功能)

发布于 作者

各位 jQuery 用户,大家好!自从上次我们与您交流以来已经有一段时间了,但我们并没有闲着。jQuery Core 团队一直在埋头开发 jQuery 1.8,我们的第一个测试版现在已经发布!您可以从 jQuery CDN 获取代码。

在您当前的 jQuery 代码上尝试一下,让我们知道它的运行效果。如果您遇到问题,请 提交错误,包括测试用例,并确保提到您正在针对 jQuery 1.8 Beta 1 进行测试。

本月晚些时候在旧金山举行的 jQuery 大会 上将有更多激动人心的 jQuery 新闻,之后将发布博客文章。

jQuery 现在为互联网上大约一半的主要网站提供支持;这已经取得了巨大成功,但我们并没有止步不前。在过去六年中,网络浏览器及其运行的设备经历了翻天覆地的变化。Web 开发流程正在不断发展,以适应正在发生的改变。作为回应,jQuery 也在不断发展。

这种演变的一部分不仅在于了解要添加什么,还要了解要删除什么。jQuery 的插件架构使开发人员可以轻松地扩展 jQuery Core 提供的功能,只要这对他们的自身需求有意义。因此,Core 添加功能的门槛相当高。我们不想为那些不需要特定功能的人创建尺寸、复杂性和性能方面的影响。

同样地,我们对人们使用 jQuery 的方式有足够的经验,知道一些最初看起来像是好主意,后来却发现不是那么好的功能。与其永远保留这些功能,我们希望最终将它们删除。事实上,我们希望能够更容易地创建 jQuery 版本,这些版本会排除您不需要或不想要的功能,尤其是对于空间宝贵的移动环境。

考虑到这一点,以下是我们计划在 jQuery 1.8 中进行的一些更改,这些更改将使其成为所有基于 HTML 的网页和应用程序(无论其平台如何)的更好基础。

模块化

从 jQuery 1.8 开始,您可以构建一个自定义版本的 jQuery,如果您不需要其功能,则可以排除一个或多个模块。这项功能通过我们基于 Ben Alman 出色的 grunt 工具的新构建系统得以实现。要构建自己的自定义版本,请从 Github 设置一个 jQuery core 仓库的副本,并使用 grunt 命令行选项排除模块。有关详细信息,请参阅 README 文件

您目前可以排除的模块包括 ajax、css、dimensions、effects 和 offset。例如,如果您的应用程序专门使用样式表和通过类进行的 CSS 动画来控制页面上项目的可见性和大小,您就可以构建一个不包含 css、dimensions、effects 和 offset 模块的版本。如果您不需要任何可选模块,您自定义构建的 jQuery 的大小将约为 21KB(已压缩并 gzip 压缩)。

但请放心,构建自己的 jQuery 是完全可选的。jQuery 一直以来都是,并将继续以压缩和未压缩的形式作为单个文件发布,并可在 CDN 上获取。我们仍然预计这将是大多数 jQuery 开发人员使用的方式,因为它简单方便。例如,当您包含一个您没有编写的 jQuery 插件时,使用完整的 jQuery 可以确保您不会被插件中隐藏的某些依赖项所困扰。

供应商前缀 CSS 属性

W3C 在提出使用供应商前缀来表示尚未标准化的 CSS 功能的想法时,其初衷是好的,但结果却不是童话般的结局。Web 开发人员面临着在样式表中包含所有供应商前缀属性名称的噩梦。jQuery 1.8 有助于减轻这种痛苦。我们自动获取非前缀属性名称,并生成当前浏览器适用的前缀,因此您不必这样做。例如,在 Chrome 上,jQuery 调用 $("#myscroll").css("marquee-direction", "backwards") 将 CSS 设置为 -webkit-marquee-direction: backwards

动画(效果)

在过去几年中,我们的动画代码已经变得杂乱无章,我们希望通过 1.8 版本,我们已经控制住了这个“野兽”。这不仅仅是清理工作;还有几个扩展点,可以更容易地添加或修改动画。目前,只有 新功能的初步文档,但在第一个测试版中,我们的主要重点将放在确保所有现有的动画代码都能正常运行。

如今,浏览器在提供高效的动画方面做得越来越好,尤其是在 CSS 过渡方面。然而,仍然有许多用户使用的浏览器无法进行基于 CSS 的动画。jQuery 1.8 让你同时获得两全其美。如果你需要支持没有内置动画的旧版浏览器,新的 $.Animation 提供了一个坚实的基础,并修复了之前版本中的许多错误。如果你只需要针对现代浏览器及其原生支持的动画,你可以这样做并完全排除动画模块。

Sizzle CSS 选择器引擎

jQuery 的选择器引擎在 1.8 中进行了重大重写。重写最显著的优势是选择器匹配的广泛 性能提升,以及对最常用选择器的改进快捷方式。

此外,Sizzle 处理了更多边缘情况和错误,包括对多个组合器(~ > +)的改进支持,以及对 querySelectorAll 中浏览器错误的更好检测。有关完整列表,请参阅选择器模块中的错误列表。

XSS 防护

从设计上来说,$() 方法可以创建 HTML 元素,并且如果传递给它的 <script> 标签包含内联脚本或 src 属性,则会运行脚本。开发人员有时会忘记这一点,将来自不受信任来源(如 URL 或用户输入)的字符串传递给 jQuery。在这种情况下,有人可能会将脚本注入页面,从而窃取 cookie 或以某种方式损害页面。

这些跨站点脚本 (XSS) 攻击在许多网站上都很常见,无论它们是否使用 jQuery,但我们希望确保 jQuery 不助长这个问题。在 jQuery 1.9(紧随 1.8 的下一个版本)中,我们将针对 $() 方法收紧“看起来像 HTML”的规则。只有当第一个字符是小于符号时,字符串才会被视为 HTML,否则将被视为 CSS 选择器。

为了进一步防止无意中注入脚本,jQuery 1.8 引入了一种新方法:$.parseHTML。它允许你将字符串指定为 HTML,并且知道它们将被解析为 HTML,而 $() 无法做到这一点,因为它也会将字符串解释为选择器。它还提供了一种将 HTML 解析为 DOM 片段并控制 HTML 中可能包含的任何脚本执行的方法。这在由 内容安全策略 (CSP) 控制的 JavaScript 环境中尤为重要,因为注入的脚本可能会导致安全警告或异常。

对于比创建单个元素(例如,$("<p/>"))更复杂的情况,尤其是在从外部数据构建字符串的情况下,我们强烈建议使用 $.parseHTML。从 jQuery 1.9 开始,由于这些更严格的规则,某些 HTML 字符串将不再被 $() 识别。

春季大扫除

在 jQuery 1.8 中,我们还将弃用和删除“绊脚石”:效率低下、无效或不建议使用的 API 和功能。我们意识到,仍然存在需要这些功能的现有 jQuery 代码。为了提供轻松无忧的未来升级路径,在删除这些弃用项目后,我们将在兼容性插件中提供许多项目。你可以关注兼容性插件在 GitHub 仓库 上的开发情况。

下面以“弃用”或“删除”开头的票据讲述了所有更改内容,但以下是一些值得注意的更改

$.browser: 从 jQuery 1.4 开始,我们就一直在宣传通过用户代理字符串进行浏览器检测是一个坏主意。然而,我们一直在助长这种不良做法,继续提供 $.browser。从 jQuery 1.9 开始,我们将完全删除它,你需要使用 1.9 兼容性插件。如果你的代码还没有摆脱浏览器检测,请查看 Modernizr,它提供了一套非常完整的特性检测,你可以使用它们。当然,你也可以直接阅读 navigator.userAgent 字符串中的信息,没有什么能阻止你,除了你的良心。

$.sub: 该方法在 jQuery 1.5 中引入,但没有证明其有用性或健壮性足以证明其留在核心中的价值。它将在 jQuery 1.9 中转移到兼容性插件。

全局 ajax 事件:目前,$.ajax 触发的事件(如 ajaxStart)可以附加到任何元素,即使是根本不在文档中的元素!这会造成一种低效的特殊情况,因此我们将在 1.8 中弃用这种行为。从 1.9 开始,Ajax 事件应该只附加到 document 上。

还有更多…

1.8 中还有许多其他更改,也许最容易查看我们一直在做什么的方式是查看正在修复的问题列表,其中包括功能和错误修复。以下是今天 1.8 的快照,但它还没有确定下来。我们欢迎你对特定问题或 jQuery 的总体方向提出反馈!

jQuery 1.8 Beta 1 更改日志

1.8 Beta 1 版本的当前更改日志。

Ajax

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

属性

  • #11153: jQuery 1.7 在 IE 8 中删除了回车符
  • #11212: Sizzle.getText 在 IE 中将不间断空格转换为空格

构建

  • #11767: 支持没有效果的自定义构建
  • #11789: 更新 README 以描述 grunt 构建系统
  • #11856: 将尺寸模块化
  • #11857: 将 css 模块化
  • #11865: 将偏移量模块化

核心

  • #10657: 弃用/删除 jQuery#size() 以支持 jQuery#length
  • #11290: 选择器被解释为 HTML
  • #11470: 添加内置的 readyP promise

Css

  • #10373: `document.defaultView` => `window`
  • #10413: width、innerWidth、innerHeight、outerWidth、outerHeight 对于隐藏父元素的“box-sizing: border-box”子元素来说是不准确的
  • #10679: CSS3 供应商前缀支持
  • #11004: 当 box-sizing 为 border-box 时,getWH 会错误地删除填充和边框宽度
  • #11787: 删除 jQuery.curCSS

数据

  • #10589: 删除 $.fn.data("events")

延迟

  • #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 中,animate 宽度从无效宽度开始
  • #7157: 动画回调显示元素仍然是“:animated”
  • #8387: jQuery 1.5 在 webkit 浏览器上使用内联和内联块元素的 hide/show 问题导致闪烁
  • #8627: .animate() 在 IE 中对 letterSpacing 失败(1.5.1 中的回归)
  • #8892: 使用 fadeIn() 和 jQuery.fx.off = true 时,在对象显示之前会触发回调
  • #9505: 在 WebKit 中混合使用百分比和像素时,animate() 问题
  • #11635: 显式的 overflow:auto 在动画期间被内联的 overflow:hidden 覆盖
  • #11755: animate 及其别名不应使用 :hidden 选择器
  • #11854: 百分比动画跳到结尾

事件

  • #8545: IE 中的事件泄漏
  • #10067: 在 document.readyState === 'interactive' 时也触发 $.ready
  • #11101: 弃用 trigger 方法中的“exclusive”事件选项
  • #11328: 在 Windows 上,Ctrl 键不会将 event.metaKey 设置为 true
  • #11500: 错误:“change”事件处理程序在 IE7 和 IE8 中手动触发时未执行
  • #11621: 在文档上触发事件不会冒泡到窗口
  • #11718: 弃用 .data() 事件
  • #11719: 弃用 .bind("ready") 事件
  • #11731: 弃用“hover”伪事件
  • #11733: 弃用 .load()、.unload() 和 .error() 方法
  • #11786: 弃用 .toggle( handler, handler, … ) 签名

操作

  • #8894: 在 IE 中,在 clone() 之后调用 appendTo() 等方法会返回不正确的 jQuery 集合
  • #10324: Clone 不会在 IE9 中复制 object 元素的 innerHTML
  • #11231: Append、Prepend、After、Before 应该接受数组作为第一个参数
  • #11338: .replaceWith() 和断开连接的节点的行为不一致。
  • #11566: 当节点是 DocumentFragment 时,node.append 等不起作用
  • #11617: 定义用于创建 HTML 片段的 $.parseHTML 方法

偏移量

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

选择器

  • #3778: 选择器匹配问题
  • #5568: 在 FF/IE 中,选择器对注释标签的行为不同
  • #8473: 在 IE9rc 中,*[tabIndex] 也选择所有没有 tabindex 的元素
  • #9400: 弃用 :text、:radio、:checkbox 等选择器扩展
  • #10003: 来自 #6963 的回归/BC 中断
  • #10074: 将两个 [] 选择器与 :first 连接不起作用
  • #10570: 当页面上有跨域 iframe 时,:text 选择器在 IE7 中抛出错误
  • #10697: Sizzle 改进
  • #10809: 在 :focus 伪类解析器中使用 ".activeElement" 的不正确测试
  • #11109: Sizzle: Expr.relative 过早截断
  • #11814: Sizzle 的元素根 QSA 策略(即附加临时 ID)没有考虑逗号和其他选择器分割
  • #11826: 探索 Sizzle 中 matchesSelector 的解析缓存系统

支持

  • #9385: 弃用 jQuery.browser
  • #11439: 使用 jQuery.support.parentNode,但不再定义。
  • #11721: 弃用并删除 jQuery.support.boxModel 的内部使用
  • #11766: 将 jQuery.support 移动到“不稳定”状态

遍历

  • #9800: 新方法:.addBack(取代 .andSelf)
  • #11543: .has 在分离的元素上不起作用
  • #11706: `.has()` 在文档片段上失败
  • #11738: 删除 .closest(Array) 返回 Array

未分类

  • #11325: 改善 domManip/buildFragment/clean
  • #11435: 过时的测试代码,用于从 .data 的返回值中删除 toJSON
  • #11777: 添加 jQuery Core 对 EditorConfig 文件的支持

jQuery 1.7.2 发布

发布日期: 作者:

jQuery 1.7.2 看起来不错!发布候选版本运行得很顺利,我们只做了一个小改动,并将在今天将其发布给你们渴望得到它的人们。您现在可以从 jQuery CDN 获取最新代码,Google 和 Microsoft CDN 将很快跟进

注意:如果您使用的是 jQuery Mobile,请仅将 jQuery 1.7.2 与 jQuery Mobile 1.1 一起使用。对于 jQuery Mobile 的先前版本,请使用 jQuery 核心 1.7.1 或更早版本。

您可以使用 错误追踪器 来报告错误;请务必在 jsFiddle 上创建一个测试用例,以便我们可以轻松地解决问题。如果您不确定这是一个错误,请在我们的 论坛StackOverflow 上提问。请不要使用下面的博客评论来报告错误。

一如既往,如果没有很多人的努力工作,这个版本是不可能完成的。首先是 jQuery 核心团队:gnarf、jaubourg、mikesherov、rwldrn 和 timmywil。jQuery UI、Mobile 和基础设施团队的支持也得到了高度赞赏,特别是 danheberden 在对抗 Trac 的英勇斗争。

像 adebree、caii、cmc3cn、KYSergey、mathiasbynens、miskith、MrMamen、Orkel、pasky、SineSwiper、tavelli 和 vlazar 这样的社区成员通过报告、验证和修复错误贡献了力量。特别感谢 gibson042 和 sindresorhus 对 jQuery 黄金叶簇的贡献,他们的工作使得 1.7.2 成为一个伟大的版本。不要让这些人独享乐趣!如果您想为 web 上最受欢迎的 Javascript 库做出贡献,请加入 IRC 上的 #jquery-dev 或 我们论坛 上的开发 jQuery 核心部分,并打个招呼!

非常感谢 Louis-Rémi Babé,他在发布前仅仅 30 分钟就提交了一个 修复负边距动画回归的补丁

jQuery 1.7.2 更改日志

以下是 1.7.2 版本的更改日志。

Ajax

  • #4624: default ajaxSettings.contentType 中的字符集
  • #10978: jQuery.param() 应该允许非原生构造对象作为属性值
  • #11264: evalScript() 使用 ajaxSetup() 设置的默认值
  • #11426: jQuery.ajax() 在 IE 中请求 JPG 图片时总是失败

属性

  • #5571: 允许在将 undefined 传递给 jQuery 中的任何 setter 时进行链式操作
  • #10828: attr(“coords”) 在 IE7 中返回 undefined
  • #10870: $.removeAttr(“selected”) 的行为不正确
  • #11316: 首先根据元素类型,然后根据节点名称来查看 valHooks,而不是反过来

构建

  • #10692: 配置 jshint 选项以更准确地匹配样式指南
  • #10693: 将单元测试中的“在 iframe 中测试某物”代码泛化
  • #10901: 如果测试器从 file:// 运行或没有 PHP,则单元测试应失败
  • #10902: 在单元测试中测试 jQuery 的构建版本的的能力
  • #10931: 单元测试不应该需要互联网访问

核心

  • #10466: jQuery.param() 将包装的原始类型误认为深层对象

Css

  • #10639: outerWidth(true) 和 css(‘margin’) 在 Webkit 中返回 % 而不是 px
  • #10754: 让 jQuery.swap 返回回调的返回值,而不仅仅是执行它
  • #10782: 计算宽度不正确
  • #10796: IE7 中 $(‘#el’).css.(‘background-position’) 的错误
  • #10858: css.js 正则表达式不完整
  • #11119: curCSS 函数只需要 2 个参数

数据

  • #11309: 十六进制格式的 data-* 属性解析错误

延迟

  • #11306: 对 $.Callbacks 对象调用 .disable() 或 .lock() 会破坏其 fired() 状态

尺寸

  • #3838: $(document).height() 在 IE6 中不正确

效果

  • #8498: 动画钩子
  • #10006: 当对文档片段调用方法 show 时,它在所有浏览器中的工作方式与预期不符
  • #10848: 动画切换在某些原子边缘情况下会丢失状态跟踪
  • #11415: 在 CSS 值非法的地方静默忽略负值
  • #11469: 动画 (.animate) 中的负边距

事件

  • #8165: .live(‘click’, handler) 在 Chrome 中的禁用按钮的子元素上触发
  • #10819: 消除“this.on.call(this, “
  • #10878: $(“select”).live(“change”, function(){ …在 jQuery 1.7 的 IE8 中损坏
  • #10961: 在 IE6-9 中使用 jQuery 1.7.1 时,XRegExp 发生错误
  • #10970: .on() 选择器参数在 :not(:first) 选择器中不起作用
  • #10984: 无法 off() 自定义事件 ($.event.special)
  • #11021: Hover hack 破坏了名为“hover”的命名空间
  • #11076: .clone(true) 会丢失委托过滤器
  • #11130: jQuery.fn.on:具有空选择器的绑定映射会忽略数据
  • #11145: $(document).on() 在 name=”disabled” 时不起作用

操作

  • #9427: 将 undefined 传递给 .text() 不会触发 setter
  • #10753: 将 evalScript 函数内联到 manipulation.js 中,因为它只使用过一次
  • #10864: 文档片段上的 text() 方法总是返回空字符串
  • #11055: 更新 HTML5 Shim 元素列表以支持最新的 html5shiv
  • #11217: Webkit 中的追加问题
  • #11291: 使用 HTML5 节点名称克隆 XMLDoc 在 IE 中会中断
  • #11323: 具有 type=”text/ecmascript” 的脚本标签会泄漏到 DOM 中
  • #11356: safeFragment 内存泄漏

杂项

  • #10952: .fired() 在 Callbacks 对象被标记为“once”时不起作用
  • #11257: 如果 PHP 缺失,测试套件中的源文件路径错误

队列

  • #10967: .promise() 不会将方法附加到目标

支持

  • #7986: 如果页面具有 DIV-element CSS,则 $.support.boxModel 存在错误
  • #11048: 支持测试会影响 IE6-9 中定位元素的布局
  • #11337: $.support.reliableMarginRight 中的错误

遍历

  • #11370: $(‘<div>’).siblings() 抛出异常

jQuery 1.7.2 RC1 发布

发布日期: 作者:

jQuery 1.7.2 即将发布!为了确保我们修复了投票“最有可能引起烦恼”的错误,并且没有引入任何新的错误,我们需要您在测试这个发布候选版本方面提供帮助。您可以从 jQuery CDN 获取代码

只需几分钟时间即可将这个最新文件引入并用您的代码进行测试。如果您有很多页面,下面的已修复错误列表可能有助于您确定需要测试的内容。当然,如果您报告了错误或受到下面列出的错误的影响,请重新测试以确保我们彻底修复了它。我们已经针对 jQuery UI 和 jQuery Mobile 的当前版本在内部进行了测试。jQuery Mobile 1.1 RC1 存在一个兼容性问题,该问题已修复,将在他们的下一个版本中解决。

想寻找更简单的方法来测试您的网站,使用最新的 jQuery 吗?在 Windows 上,您可以使用优秀的 Fiddler 工具,并创建一个 自动响应规则,将您对 jQuery 的 HTTP 脚本请求指向上面的文件位置。然后,您就可以使用 PC 上的最新 jQuery 测试您的实时网站,而无需编辑任何文件!如果您知道其他平台上类似的工具,请在下面的评论中留言。

如果您特别关注 IE6 支持,请帮助我们。我们偶尔会在 IE6 中运行单元测试时遇到问题。我们无法确定这些问题的原因,但问题并不总是发生,而且我们测试套件的庞大规模可能只是压垮了一个十多年历史的浏览器。如果您在真实代码中观察到任何可再现的错误,请告诉我们,并尽量提供尽可能小的测试用例。

您可以使用 错误追踪器 来报告错误;请务必在 jsFiddle 上创建一个测试用例,以便我们可以轻松地解决问题。如果您不确定这是一个错误,请在我们的 论坛StackOverflow 上提问。请不要使用下面的博客评论来报告错误。

jQuery 1.7.2rc1 更改日志

以下是 1.7.2rc1 版本的当前更改日志。

Ajax

  • #4624: default ajaxSettings.contentType 中的字符集
  • #10978: jQuery.param() 应该允许非原生构造对象作为属性值
  • #11264: evalScript() 使用 ajaxSetup() 设置的默认值
  • #11426: jQuery.ajax() 在 IE 中请求 JPG 图片时总是失败

属性

  • #5571: 允许在将 undefined 传递给 jQuery 中的任何 setter 时进行链式操作
  • #10828: attr(“coords”) 在 IE7 中返回 undefined
  • #10870: $.removeAttr(“selected”) 的行为不正确
  • #11316: 首先根据元素类型,然后根据节点名称来查看 valHooks,而不是反过来

构建

  • #10692: 配置 jshint 选项以更准确地匹配样式指南
  • #10693: 将单元测试中的“在 iframe 中测试某物”代码泛化
  • #10901: 如果测试器从 file:// 运行或没有 PHP,则单元测试应失败
  • #10902: 在单元测试中测试 jQuery 的构建版本的的能力
  • #10931: 单元测试不应该需要互联网访问

核心

  • #10466: jQuery.param() 将包装的原始类型误认为深层对象

Css

  • #10639: outerWidth(true) 和 css(‘margin’) 在 Webkit 中返回 % 而不是 px
  • #10754: 让 jQuery.swap 返回回调的返回值,而不仅仅是执行它
  • #10782: 计算宽度不正确
  • #10796: IE7 中 $(‘#el’).css.(‘background-position’) 的错误
  • #10858: css.js 正则表达式不完整
  • #11119: curCSS 函数只需要 2 个参数

数据

  • #11309: 十六进制格式的 data-* 属性解析错误

延迟

  • #11306: 对 $.Callbacks 对象调用 .disable() 或 .lock() 会破坏其 fired() 状态

尺寸

  • #3838: $(document).height() 在 IE6 中不正确

效果

  • #8498: 动画钩子
  • #10006: 当对文档片段调用方法 show 时,它在所有浏览器中的工作方式与预期不符
  • #10848: 动画切换在某些原子边缘情况下会丢失状态跟踪
  • #11415: 在 CSS 值非法的地方静默忽略负值

事件

  • #8165: .live(‘click’, handler) 在 Chrome 中的禁用按钮的子元素上触发
  • #10819: 消除“this.on.call(this, “
  • #10878: $(“select”).live(“change”, function(){ …在 jQuery 1.7 的 IE8 中损坏
  • #10961: 在 IE6-9 中使用 jQuery 1.7.1 时,XRegExp 发生错误
  • #10970: .on() 选择器参数在 :not(:first) 选择器中不起作用
  • #10984: 无法 off() 自定义事件 ($.event.special)
  • #11021: Hover hack 破坏了名为“hover”的命名空间
  • #11076: .clone(true) 会丢失委托过滤器
  • #11130: jQuery.fn.on:具有空选择器的绑定映射会忽略数据
  • #11145: $(document).on() 在 name=”disabled” 时不起作用

操作

  • #9427: 将 undefined 传递给 .text() 不会触发 setter
  • #10753: 将 evalScript 函数内联到 manipulation.js 中,因为它只使用过一次
  • #10864: 文档片段上的 text() 方法总是返回空字符串
  • #11055: 更新 HTML5 Shim 元素列表以支持最新的 html5shiv
  • #11217: Webkit 中的追加问题
  • #11291: 使用 HTML5 节点名称克隆 XMLDoc 在 IE 中会中断
  • #11323: 具有 type=”text/ecmascript” 的脚本标签会泄漏到 DOM 中
  • #11356: safeFragment 内存泄漏

杂项

  • #10952: .fired() 在 Callbacks 对象被标记为“once”时不起作用
  • #11257: 如果 PHP 缺失,测试套件中的源文件路径错误

队列

  • #10967: .promise() 不会将方法附加到目标

支持

  • #7986: 如果页面具有 DIV-element CSS,则 $.support.boxModel 存在错误
  • #11048: 支持测试会影响 IE6-9 中定位元素的布局
  • #11337: $.support.reliableMarginRight 中的错误

遍历

  • #11370: $(‘<div>’).siblings() 抛出异常

jQuery 1.7.2 Beta 1 发布

发布日期: 作者:

大家好,互联网!我们是 jQuery 核心团队!我们有一段时间没有说话了,但在假期里,我们一直在忙着修复您报告的错误。这些努力的结果就是 jQuery 1.7.2 Beta 1。我们决定在 土拨鼠日 发布一个测试版,这样您就不会再处于六周未修复错误的阴影之下。

您可以从 jQuery CDN 获取代码

哦,我们知道你在想什么:“酷,jQuery 的新版本;我会等到最终版本发布几周后再试。” 没错,然后你会发现一些阻止你升级的错误。没有什么比我们完成一个版本,然后才看到一个关于严重错误的报告更令人难过,因为这个错误本来可以在更早的时候修复。

所以请您从地洞里出来,用您的代码试试这个测试版。我们有没有漏掉一个旧的错误?我们是否创造了一个新的错误,让你感觉像比尔·默里醒来听到“I Got You Babe?”我们想知道。您可以使用错误跟踪器报告错误;请务必在jsFiddle上创建一个测试用例,以便我们能够轻松地找到它。如果您不确定它是否是一个错误,请在我们的论坛StackOverflow上提问。

jQuery 1.7.2b1 更改日志

1.7.2b1 版本的当前更改日志。

Ajax

  • #10978: jQuery.param() 应该允许非原生构造对象作为属性值

属性

  • #5571: 允许在将 undefined 传递给 jQuery 中的任何 setter 时进行链式操作

构建

  • #10692: 配置 jshint 选项以更准确地匹配样式指南
  • #10902: 在单元测试中测试 jQuery 的构建版本的的能力
  • #10931: 单元测试不应该需要互联网访问

核心

  • #10466: jQuery.param() 将包装的原始类型误认为深层对象

Css

  • #10639: outerWidth(true) 和 css(‘margin’) 在 Webkit 中返回 % 而不是 px
  • #10754: 让 jQuery.swap 返回回调的返回值,而不仅仅是执行它
  • #10782: 计算宽度不正确
  • #10796: IE7 中 $(‘#el’).css.(‘background-position’) 的错误
  • #10858: css.js 正则表达式不完整
  • #11119: curCSS 函数只需要 2 个参数

效果

  • #8498: 动画钩子
  • #10006: 当对文档片段调用方法 show 时,它在所有浏览器中的工作方式与预期不符
  • #10848: 动画切换在某些原子边缘情况下会丢失状态跟踪

事件

  • #8165: .live(‘click’, handler) 在 Chrome 中的禁用按钮的子元素上触发
  • #10819: 消除“this.on.call(this, “
  • #10878: $(“select”).live(“change”, function(){ …在 jQuery 1.7 的 IE8 中损坏
  • #10961: 在 IE6-9 中使用 jQuery 1.7.1 时,XRegExp 发生错误
  • #10970: .on() 选择器参数在 :not(:first) 选择器中不起作用
  • #10984: 无法 off() 自定义事件 ($.event.special)
  • #11021: Hover hack 破坏了名为“hover”的命名空间
  • #11076: .clone(true) 会丢失委托过滤器
  • #11130: jQuery.fn.on:具有空选择器的绑定映射会忽略数据
  • #11145: $(document).on() 在 name=”disabled” 时不起作用

操作

  • #9427: 将 undefined 传递给 .text() 不会触发 setter
  • #10753: 将 evalScript 函数内联到 manipulation.js 中,因为它只使用过一次
  • #10864: 文档片段上的 text() 方法总是返回空字符串
  • #11055: 更新 HTML5 Shim 元素列表以支持最新的 html5shiv

杂项

  • #10952: .fired() 在 Callbacks 对象被标记为“once”时不起作用
  • #11257: 如果 PHP 缺失,测试套件中的源文件路径错误

支持

  • #11048: 支持测试会影响 IE6-9 中定位元素的布局

征集 jQuery 1.8 版本的意见

发布于 作者

我们已准备好进行下一轮社区意见收集,这次是针对 1.8 版本!这是您提出建议的机会,我们可以修复、添加、更改或删除 jQuery 中的内容,以使其变得更好。

您可以使用此表格添加建议;在可能的情况下,请提供指向错误报告、包含详细说明的页面或代表您想法的实现的链接。我们希望在 12 月 5 日之前收到您的所有意见,以便我们可以在制定 1.8 版本路线图之前阅读和讨论它们。

非常感谢大家在我们关于如何通过精简 jQuery 来改进 jQuery 的早期博客文章中留下的建议。我们已经仔细阅读了这些评论,并对如何在未来版本中解决其中一些问题有一些想法。

创建可配置的下载构建器

很多人想知道为什么我们没有办法构建一个只包含您需要的 jQuery 部分的文件,因为例如 jQuery UI 具有该选项。情况并不完全相同。您知道是否正在使用,比如 UI 手风琴,因为您直接调用它。您通常不知道您或您在页面上包含的某些插件是否正在使用 $.fn.prepend() 或 $.fn.animate()。您是否使用它们甚至可能取决于您在运行时传递给插件的参数。

为了保持 jQuery 开发的可管理性并确保 CDN 可以提供一个单一文件,以便互联网上的每个人都可以有效地共享和缓存,该团队希望继续使用单个文件作为其主要产品。创建可配置的下载可能会稍微改善文件大小,但它也会使文档、插件使用和调试变得更加复杂。这对您和我们来说都是更多工作。

我们已经开始努力通过消除 jQuery 内部不需要的依赖项来提高模块化;我们宣布的许多弃用功能将针对删除这些依赖项。通过打下这个基础,其他人想要创建他们自己的较小的 jQuery 子集或模块化版本应该会容易得多。

但是,我们相信我们可以做得更好,并希望提供自动化的方式,让任何用户都可以创建包含应用程序代码和 jQuery 中所需部分的最佳最小化文件。特别是,我们正在与 Google Closure Compiler 团队合作,看看我们是否可以使用其ADVANCED_OPTIMIZATIONS选项。我们将随着进展提供更多关于我们进展的信息。

等到 2.0 版本再删除内容

我们对破坏所有现有的 jQuery 代码非常敏感。这就是我们尽早弃用它们的原因,以便人们有足够的时间更改他们的代码。仅仅因为我们今天弃用了某些内容,并不一定意味着我们将在下一个版本中删除它。我们认为 1.8 版本中实际删除的内容列表很小,不太可能影响大多数用户。

如果我们对 Closure Compiler 的实验结果如预期的那样,我们甚至可以保留许多已弃用的功能,但如果未使用它们并构建包含 jQuery 的自定义应用程序文件,它们将被自动删除。这将是两全其美的方法。

删除 IE 6、7 和/或 8 的支持

这个话题经常被提起,所以让我们试着彻底解决它。人们往往高估了 jQuery 中专门与 IE 相关的代码量。IE 6 和 IE 7 中的大多数问题也存在于 IE 8 中,因此只要最后一个浏览器仍然拥有可观的桌面市场份额并必须得到支持,就没有真正的删除前两个浏览器支持的大小或复杂性优势。没有人(包括微软本身)喜欢这些侏罗纪公园浏览器,但现在就剥夺对它们的支持会导致许多用户的网站无法使用。

也就是说,我们知道在某些情况下,例如移动浏览器,不需要旧的 IE 支持。我们正在研究如何将尽可能多的代码放入一个清晰标记的块中,以便那些愿意创建他们自己的自定义 jQuery 版本的人可以轻松地将其删除。我们也可能会在解决这个问题时获得 Closure Compiler 的帮助。但是,我们不确定这是否会节省 gzip 文件大小,而且它不会提供性能提升,因为这些代码路径在其他浏览器中没有被使用。

删除 jQuery.browser

我们已经记录了近两年,我们打算将 jQuery.browser 迁移到插件,而且很多人也在评论中提出了建议。浏览器嗅探不是查找功能的可靠方法,我们建议使用Modernizr等工具。用于浏览器嗅探的正则表达式很大,而且压缩效果不好;将其迁移到插件将确保只有使用它的人才需要承担这种大小损失。

您的想法呢?

请抓住这个机会,给我们提供您的意见。该团队期待审查您的建议。哦,别忘了尽快尝试 jQuery 1.7.1!

jQuery 1.7.1 发布

发布于 作者

在美国,我们本周正在庆祝感恩节。对于那些住在世界其他地方的人来说,这是一个安装和测试新版 Javascript 库,同时享用妈妈自制美食的时刻。有点像代码冲刺,但食物更好。我们邀请全世界的人加入我们的这些传统。

为了开启庆祝活动,jQuery 团队非常感谢能够发布 1.7.1 版本!在这轮迭代中,我们在下面列出的丰富错误方面取得了重大进展。我们正在 jQuery CDN 上提供美味的副本,新鲜出炉,热乎乎的

这些最新文件也将在不久后出现在主要 CDN 上,但请耐心等待,因为这也是他们的假期周。

请用您的代码安装并测试这个最新的 jQuery 版本。我们希望您会觉得它很美味。如果您忘记了炸一些错误,我们希望听到您的反馈。只需为遇到的问题创建一个具体的测试用例(我们喜欢jsFiddle.net),并在bugs.jquery.com上创建一个错误报告。

此外,请欢迎新的 jQuery 核心团队成员 Mike Sherov!我们很感谢他在我们为即将发布的版本所计划的所有伟大事情中提供帮助。Mike 在纽约市的SNAP Interactive公司全职工作,但在业余时间为该项目做贡献。请效仿 Mike,尽你所能帮助该项目。不需要写代码。我们总是需要帮助回答论坛上的问题,或者只是在错误跟踪器上重现和识别难以捉摸的错误的来源。请查看我们的参与项目页面以获取信息。

我们将在一天或两天内开放 1.8 版本的意见征集。看一下 1.7.1 版本,想一下我们可以为下一个大版本添加什么样的炫酷功能!

jQuery 1.7.1 更改日志

1.7.1 版本的更改日志。

Ajax

  • #10723: jqXHR.always() 返回一个 Promise 而不是 jqXHR 对象

属性

  • #10724: $(document).text() 始终返回空字符串
  • #10773: removeAttr 对边缘情况很脆弱

构建

  • #10630: 修复与焦点相关的测试失败,以解决 Swarm 失败

核心

  • #10616: 在 .eq 中未对 -1 进行类型强制转换
  • #10646: 让 jQuery.error 抛出 instanceof Error 对象
  • #10682: 使用 $(‘ ‘) 创建 DOM 元素会导致内存泄漏并跳过片段缓存
  • #10687: jQuery 过早地调用 AMD define() 全局函数
  • #10690: isNumeric

Css

  • #10733: 在 css 模块中使用 for 循环代替 jQuery.each

数据

  • #10675: 使用 internalKey 快捷方式代替 jQuery.expando

效果

  • #10669: .animate() 不再对百分比 (%) 宽度进行动画
  • #10750: 数据对象中的“null”会导致 stop 中的错误

事件

  • #10676: wheelDelta 不再添加到 mousewheel 事件
  • #10701: 使用 submit 函数提交表单的问题
  • #10704: special.handle 方法应该在 origType 名称下触发
  • #10705: off 错误事件名称解析器
  • #10712: 使用 live 绑定触发 blur 失败
  • #10717: 触发的 load 向上冒泡到窗口
  • #10791: 委托事件在 SVG 元素上失败
  • #10794: .triggerHandler 不应 .preventDefault()
  • #10798: live(“submit”) 和 .submit() 会导致非侵入式 ajax live 触发两次
  • #10844: 当表单包含名为“id”的输入时,.delegate() 在提交时不起作用

操作

  • #10177: .wrap 中回调函数的索引始终为 0
  • #10667: .wrapAll() 中的 HTML5 支持会向元素添加“:”
  • #10670: rnoshimcache 可能构造不正确
  • #10812: 在 IE7 中,将空对象传递给 .before() 或 .after() 会引发异常

杂项

  • #10691: 从单元测试中删除所有出现的“equals”和“same”函数

支持

  • #10629: IE 对假体过于敏感。探索清理 support.js 以避免任何未来的崩溃。
  • #10807: 注释中的非 ASCII 单引号

jQuery 1.7.1 RC1 发布

发布于 作者

我们想让你知道,jQuery Central 并没有闲着,我们发布了 jQuery 的一个新的预览版本。它修复了自 1.7 版本发布以来社区报告的问题。请在你的应用中测试代码,确保没有重大问题。如果你试过 jQuery 1.7 并报告了 bug,它应该在这个版本中被修复。

您可以从 jQuery CDN 获取代码

你可以帮助我们,将这些代码放到你现有的应用程序中,并告诉我们是否有什么东西不再工作。请 提交 bug ,并确保提到你在测试 jQuery 1.7.1 RC1。

我们希望鼓励社区中的每个人尝试并 参与 为 jQuery 核心做出贡献。我们已经设置了一个 完整页面 的信息,专门用于帮助你更深入地参与到团队中。团队就在这里,随时准备帮助你帮助我们!

jQuery 1.7.1 RC1 更改日志

这是 1.7.1 RC1 版本的当前更改日志。

Ajax

  • #10723: jqXHR.always() 返回一个 Promise 而不是 jqXHR 对象

属性

  • #10724: $(document).text() 始终返回空字符串
  • #10773: removeAttr 对边缘情况很脆弱

构建

  • #10630: 修复与焦点相关的测试失败,以解决 Swarm 失败

核心

  • #10616: 在 .eq 中未对 -1 进行类型强制转换
  • #10646: 让 jQuery.error 抛出 instanceof Error 对象
  • #10682: 使用 $(‘ ‘) 创建 DOM 元素会导致内存泄漏并跳过片段缓存
  • #10687: jQuery 过早地调用 AMD define() 全局函数
  • #10690: isNumeric

Css

  • #10733: 在 css 模块中使用 for 循环代替 jQuery.each

数据

  • #10675: 使用 internalKey 快捷方式代替 jQuery.expando

效果

  • #10669: .animate() 不再对百分比 (%) 宽度进行动画
  • #10750: 数据对象中的“null”会导致 stop 中的错误

事件

  • #10676: wheelDelta 不再添加到 mousewheel 事件
  • #10701: 使用 submit 函数提交表单的问题
  • #10704: special.handle 方法应该在 origType 名称下触发
  • #10705: off 错误事件名称解析器
  • #10712: 使用 live 绑定触发 blur 失败
  • #10717: 触发的 load 向上冒泡到窗口
  • #10791: 委托事件在 SVG 元素上失败
  • #10794: .triggerHandler 不应 .preventDefault()
  • #10798: live(“submit”) 和 .submit() 会导致非侵入式 ajax live 触发两次

操作

  • #10177: .wrap 中回调函数的索引始终为 0
  • #10667: .wrapAll() 中的 HTML5 支持会向元素添加“:”
  • #10670: rnoshimcache 可能构造不正确
  • #10812: 在 IE7 中,将空对象传递给 .before() 或 .after() 会引发异常

杂项

  • #10691: 从单元测试中删除所有出现的“equals”和“same”函数

支持

  • #10629: IE 对假 body 太过敏感。探索清理 support.js 以避免将来出现任何崩溃。

构建更精简的 jQuery

发布于 作者

jQuery 现在已经超过五年了!在这段时间里,它随着它所服务的浏览器、网站、设备、开发者和用户一起发展。它也,嗯,在这段时间里 增长了不少。jQuery 添加了许多有用的功能,但也积累了一些我们不想永久支持的累赘。它在台式电脑上可能不是问题,因为台式电脑有高速连接,但我们希望 jQuery 也是移动设备的良好解决方案。

除了我们不断追求更高性能,我们对未来版本的优先级是更小的压缩文件大小。当每个新功能或错误修复也必须保留所有现有功能和行为时,很难做到这一点。因此今天,我们希望开始一个关于通过弃用一些功能来精简 jQuery API 的对话。以下是我们的弃用指南。

  • 我们认为该功能不代表使用 jQuery 的当前最佳实践。
  • 该功能在实际使用中被证明不受欢迎、令人困惑、效率低下或无效。
  • 增强该功能或解决其局限性并不实际或可行。
  • 在将来某个时间将其删除可能会带来显著的可用性、大小或性能优势。

弃用只是你可以参与其中的过程的第一步。我们的目标是

  • 解释弃用特定功能的原因,如上所述。
  • 在弃用和删除之间至少提供一个主要版本号,通常更多。
  • 为已弃用的功能提供替代方案,以使迁移不那么痛苦。
  • 倾听社区关于弃用和删除的反馈。

有时,就像在 1.7 版本中的 event.layerX/layerY 的情况下,如果我们判断立即删除该功能比保留它造成的痛苦更少,我们会以更短的通知做出重大更改。希望这将是罕见的例外。

1.7 版本弃用

考虑到这些因素,我们认为以下功能从 1.7 版本开始被弃用。使用这些功能的现有代码继续有效,但推荐的替代方案是与未来版本兼容的更好选择。

.live() 和 .die(): 我们继续收到许多关于 .live() 方法的怪癖的错误报告,并看到用户对此感到困惑。常见问题现在已记录在其 更新的 API 页面 上。我们强烈建议在新代码中使用 .on() 或 .delegate(),因为它们是更好的 API。鉴于其广泛使用,我们不太可能在 1.8 中删除此 API,但请尽快更新你的代码。

非标准事件属性: 作为我们改进事件处理程序性能的努力的一部分,我们也弃用了从原生事件对象到 jQuery 事件对象复制几个事件属性的操作,并将在 1.8 中删除它们:attrChange、attrName、relatedNode 和 srcElement。不要通过 event.NAME 访问这些属性,而是可以通过 event.originalEvent.NAME 访问它们,如果需要的话。

$.ajax() Deferred 别名: 在 1.5 版本中,我们在 jqXHR 对象上定义了 .error()/,success()/.complete() 作为 Deferred 的 .fail()/.done()/.always() 方法的别名。虽然当时这似乎是一个好主意,但它使 jqXHR 成为非标准的 Deferred。这不是一件好事。尽可能地,优先使用 deferred/promise 方法名而不是 jqXHR 方法名。我们在这方面还有一些工作要做,以提供完整的迁移路径,因此我们可能会在 1.8 之后继续支持这些别名。

deferred.isResolved() 和 deferred.isRejected(): 现在 Deferred 和 Promises 具有进度通知和方便的 .state() 方法,我们弃用了这些旧方法,并将在 1.8 中删除它们。使用 N-1 个布尔方法获取 N 状态对象的 state 是一个残酷的代码版本,叫做“二十个问题”。基于 Deferred 的代码很少需要检查 state,而现在返回的字符串对于调试场景来说更方便,在调试场景中它经常被使用。

.attr(“value”) 在输入框上: 为了向后兼容,我们一直在返回这里的当前值(如“当前在输入框中的内容”)而不是真正的属性(HTML 中的 value 属性的值)。这让我们无法提供真正的属性值,并且令人困惑,因为 W3C 选择器作用于属性而不是当前值。因此,我们弃用了这种行为,并将在 1.8 中删除它。始终使用 .val() 方法获取输入元素的当前实时值。在我们能够收回属性之前,你可以使用 $("selector")[0].getAttribute("value"),除了在 IE 6/7 上,它仍然会返回当前值。(我们的 1.8 解决方案将在所有浏览器上获取属性值,这也是我们迫切希望更改的原因。)

.closest(Array) 返回 Array: 这种签名有点奇怪,它是为旧的 live 事件代码创建的,但它返回的是一个 Array,而不是一个 jQuery 对象。从 1.8 版本开始,我们计划将其删除。.closest() 的其他签名将保留,不受影响。

.data(“events”): jQuery 将其与事件相关的 data 存储在一个名为(等等)events 的 data 对象中,该对象位于每个元素上。这是一个内部 data 结构,因此在 1.8 中,它将从用户 data 命名空间中删除,因此它不会与具有相同名称的项目发生冲突。jQuery 的事件 data 仍然可以通过 jQuery._data(element, "events") 访问,但请注意,这是一个内部 data 结构,未记录,不应该修改。

$.sub() 作为插件: 虽然 $.sub() 对创建插件的无干扰区域很有用,但它不被 jQuery 核心使用,也不被其他代码广泛使用,因此我们打算在 1.8 版本中将其转换为插件,以节省空间。

展望 jQuery 1.8

考虑到我们对精简 jQuery 的追求,1.8 中新功能的过滤器将非常严格。即使是与性能相关的提案,也需要在它们使用的空间或节省的空间之间取得平衡。可以通过插件、特殊事件、属性钩子或其他 jQuery 扩展机制实现的功能,可能会暂时保留在核心之外。

这就引出了一个问题,即我们可以在 1.8 中弃用什么,并最终删除什么,以简化和简化库。这些东西不必完全消失;例如,它们可以迁移到一个单独的插件中,并且只有在需要时才包含进来。看看你如何使用 jQuery,并与你的同事讨论这个问题。

几周内,我们将通过另一篇博文发布关于 jQuery 1.8 的想法征集——所以现在就开始思考吧!

编辑: 不,我们还没有删除 IE6 支持,我们也不能。正如 John Resig 在每次 jQuery 大会上提到的那样,IE6 的大多数罪过也加在了 IE7 和 IE8 上,这两个浏览器加起来仍然占有 三分之一以上 的桌面浏览器市场份额。在我们能够同时砍掉 IE7 和 IE8 之前,删除对 IE6 的支持是没有意义的。

jQuery 1.7 发布

发布于 作者

jQuery 1.7 现已可以下载!你可以从 jQuery CDN 获取代码

这个新版本也应该在一两天内在 Google 和 Microsoft CDN 上可用。

感谢你在测试和报告 beta 期间的 bug 方面提供的帮助,我们相信我们已经发布了一个稳定可靠的版本。如果你确实发现了问题,请 提交 bug ,并确保在版本选择中选择 jQuery 1.7。另外,请务必提供一个 jsFiddle 测试用例 ,以便我们能够快速分析问题。

jQuery 1.7 中的新功能

API 网站上的 1.7 版本标签 是了解本版本新功能的好方法。以下是 1.7 中一些重要项目的简要介绍,以及 API 文档中尚未提及的一些内容。

新的事件 API:.on() 和 .off()

新的 .on().off() API 统一了 jQuery 中将事件附加到文档的所有方式——而且它们更容易输入!

$(elements).on( events [, selector] [, data] , handler );
$(elements).off( [ events ] [, selector] [, handler] );

当提供选择器时,.on() 类似于 .delegate(),因为它附加了一个委托的事件处理程序,该处理程序由选择器过滤。当选择器被省略或为 null 时,该调用类似于 .bind()。有一个模棱两可的情况:如果 data 参数是一个字符串,你必须提供一个选择器字符串或 null,这样 data 不会被误认为是选择器。将一个对象传递给 data,你就不必担心特殊情况。

所有现有的事件绑定方法(以及它们相应的解绑方法)在 1.7 中仍然存在,但我们建议你对任何你已知使用 1.7 或更高版本的 jQuery 项目使用 .on()。以下是一些在旧 API 调用和新 API 调用之间进行映射的示例

$('a').bind('click', myHandler);
$('a').on('click', myHandler);

$('form').bind('submit', { val: 42 }, fn);
$('form').on('submit', { val: 42 }, fn);

$(window).unbind('scroll.myPlugin');
$(window).off('scroll.myPlugin');

$('.comment').delegate('a.add', 'click', addNew);
$('.comment').on('click', 'a.add', addNew);

$('.dialog').undelegate('a', 'click.myDlg');
$('.dialog').off('click.myDlg', 'a');

$('a').live('click', fn);
$(document).on('click', 'a', fn);

$('a').die('click');
$(document).off('click', 'a');

委托事件的性能提升

随着页面大小和复杂性的增加,事件委托变得越来越重要。像 Backbone、JavaScriptMVC 和 Sproutcore 这样的应用程序框架大量使用事件委托。考虑到这一点,jQuery 1.7 事件处理进行了重构,目的是使委托事件更快,特别是对于最常见的情况。

为了优化最常用选择器形式的代码,我们检查了 Google Codesearch 中的代码片段。在 .live().delegate() 方法调用中使用的选择器中,近三分之二的选择器采用 tag#id.class 的形式,其中使用了一个或多个标签、ID 或类。通过在事件附加时使用 JavaScript 解析这些简单选择器,我们能够在事件传递期间胜过浏览器对 matchesSelector 的原生代码实现。对于更复杂的选择器,我们仍然使用 Sizzle 引擎,因此所有现有代码都应继续工作。

最终结果是,委托事件的交付时间约为 1.6.4 中的一半。

在 IE6/7/8 中更好地支持 HTML5

任何尝试使用新的 HTML5 标签(例如 <section>)的人,无疑会遇到 IE 6/7/8 不仅不理解这些标签,实际上还将其从文档中删除的问题。在 jQuery 1.7 中,我们内置了对在旧版 IE 中使用 HTML5 标签的支持,例如使用 .html() 方法。此支持与以前需要 innerShiv 相当。您仍然必须在旧版 IE 中的文档头部包含 html5shiv (或 Modernizr),以支持 HTML5 标签。有关更多背景信息,请参阅 HTML5 Shiv 的故事

切换动画直观地工作

在以前版本的 jQuery 中,切换动画(例如 .slideToggle().fadeToggle())在动画叠加并且先前动画使用 .stop() 终止时无法正常工作。这个问题已经在 1.7 中 修复,因此动画系统会记住元素的初始值,并在切换动画过早终止时将其重置。

异步模块定义 (AMD)

jQuery 现在支持 AMD API。请注意,jQuery 1.7 本身不是脚本加载器;它与 AMD 兼容的加载器(例如 RequireJS 或 curl.js)协同工作,以便可以动态加载它,并且 ready 事件可以由加载器控制。现在,AMD 兼容的加载器可以从 CDN(例如 Google 或 Microsoft 的 CDN)加载未修改的 jQuery 1.7 版本。非常感谢 James Burke (@jrburke) 提交补丁和单元测试,然后耐心等待我们将其合并。

jQuery.Deferred

jQuery.Deferred 对象已扩展了新的进度处理程序和通知方法,这些方法会调用这些处理程序。这使您可以异步地通知请求的进度监听器,而无需解析或拒绝请求。此外,还有一个新的 state() 方法,该方法返回 Deferred 的当前状态;它主要用于调试。

Deferred 现在使用新的 jQuery.Callbacks 功能实现,这是一种对一系列处理程序进行排队和触发的通用方法。此功能可能对插件编写者很有用,尽管 Deferred 和事件子系统为此类功能提供了更高级别的接口。

jQuery.isNumeric()

在 jQuery 内部,我们发现了一些需要知道某个参数是否为数字的情况,或者如果它是其他类型,它是否能够成功转换为数字。我们决定编写并记录 jQuery.isNumeric(),因为它是一个有用的实用程序。将任何类型的参数传递给它,它将返回相应的 truefalse

已删除的功能

event.layerX 和 event.layerY:我们在 1.7 版中已删除这些非标准属性。虽然我们通常会为这些属性执行过时通知期,但 Chrome 16 版会在页面上生成大量 控制台警告消息。因此,我们决定立即将其删除。在仍然支持这些属性的平台上,可以通过 event.originalEvent.layerXevent.originalEvent.layerY 获取它们。

jQuery.isNaN():此未记录的实用程序函数已被删除。它令人困惑,因为它借用了内置 JavaScript 函数的名称,但没有相同的语义。新的 jQuery.isNumeric() 服务于类似目的,但它具有被记录和支持的优势。尽管 jQuery.isNaN() 未记录,但 Github 上的几个项目都在使用它。我们已经联系了他们,并要求他们使用 jQuery.isNumeric() 或其他解决方案。

jQuery.event.proxy():此未记录且已过时的已被删除。用户应改为调用已记录的 jQuery.proxy 方法。

jQuery 团队以及您的作用

我要感谢我们定期团队贡献者在发布此版本方面做出的出色工作,尤其是 Timmy Willison(Github 上的 timmywil)、Corey Frang(gnarf)、Rick Waldron(rwldrn)和 Julian Aubourg(jaubourg)。Karl Swedberg(kswedberg)和 Addy Osmani(addyosmani)在将新文档整理到 API 站点上付出了很多努力。此外,感谢 Mike Sherov(mikesherov),他是一位新晋贡献者,已经为多个棘手的错误创建了补丁。非常感谢所有报告错误、提交拉取请求、审查提交以及以其他方式确保我们尽最大努力的人。

尽管如此,我们始终需要更多帮助,这就是您做出贡献的地方。您可以做的最简单、最重要的事情就是偶尔测试我们正在进行的工作,以确保它们符合您的代码和预期。它始终位于 https://code.jqueryjs.cn/jquery-git.js,并且每次在我们的 github.com 上的 master 分支 中进行新的提交时都会构建一个新的副本。如果您在最终版本中发现错误,请针对 jquery-git.js 进行测试,以查看该错误是否已修复。这很容易,因为 jsFiddle.net 提供了一个选项,可以使用 jquery-git.js 文件作为“jQuery (edge)”来测试您的代码。

如果您想做更多事情,我们很乐意让您参与进来!我们编写了一份 文档,可以帮助您开始使用此流程,并且我们中的一位或多位成员通常会在 IRC 上的 #jquery-dev 频道中为您提供帮助或信息。

jQuery 1.7 更改日志

1.7 版本的当前更改日志。

Ajax

  • #9399:弃用 jqXHR.success 和 jqXHR.error

属性

  • #5479:removeAttr:删除多个属性
  • #6743:将 enctype 映射到 encoding,具体取决于浏览器
  • #10176:注入的脚本标签被评估两次
  • #10278:checkboxEl.attr(‘checked’) 在 checkboxEl.click() 之后返回过时值
  • #10429:IE7 – 在调用 removeAttr(‘contenteditable’) 时,无效的过程调用或参数;
  • #10514:removeAttr 在 IE6/7 中没有删除 class 属性

核心

  • #6485:IE 中 HTML5 的解决方案
  • #7102:将 jQuery 注册为 CommonjS 异步模块
  • #9453:$.inArray 不支持 fromIndex
  • #10478:将 jQuery.isNaN 切换为 jQuery.isNumeric

Css

  • #10267:IE8 和 window is(‘:visible’) 会崩溃

数据

  • #7323:允许使用 $.fn.removeData 一次删除多个数据键
  • #8909:$(element).data() 会比必要时扫描所有属性。
  • #8921:jQuery 私有数据应保持私有

延迟

  • #8856:请求:deferred.isUnresolved()
  • #9033:IE8 中的 try{ } finally{ } 错误
  • #9398:改进 Deferred 的提案

尺寸

  • #9434:.outerWidth()/.outerHeight()/.innerWidth()/.innerHeight() 应在窗口和文档上工作

效果

  • #5684:效果:动画回调中的异常会导致无限循环
  • #6150:.stop 有时不会清除 .delay
  • #6641:在动画完成回调中调用 stop() 会导致其他动画冻结
  • #8685:动画应跟踪动画状态以正确处理堆叠动画
  • #9280:允许 animate() 具有多个效果队列
  • #9548:animate 对 svg 元素的 fill-opacity css 属性不起作用
  • #10445:将 queue 设置为 true 会导致错误
  • #10497:.stop 应允许选择要停止的队列
  • #10622:.show() 无法正确恢复 CSS 设置的“display”值

事件

  • #3368:event.metaKey 应仅在非 Mac 系统上分配给 event.ctrlKey
  • #6170:jQuery(window).scroll(); 导致 IE* 滚动到 0,0
  • #6319:回归:IE 中 change 处理程序内的 stopPropagation 会错误地应用于 keydown 事件
  • #6386:通过“event.special.live.add”支持 live 事件的 data 参数
  • #6593:IE8:DOM 0 事件处理程序在通过 jQuery 附加另一个处理程序时被调用两次
  • #6667:在某些情况下,表单元素上的 submit 事件不会在 IE* 中委托
  • #6903:特殊事件需要一种方法来确定它们是使用 .bind 还是 .live/.delegate 绑定
  • #6942:JQuery.event.fix 在 IE 中处理键事件时会导致不必要的重绘
  • #7139:“hover” 事件别名应适用于 .bind 和 .live
  • #7161:表单元素上的 Submit 事件在 IE 中未正确解除绑定
  • #7444:在 ie8 或 ie7 中,使用“Enter”而不是按钮单击提交表单会触发两次 live submit 事件。
  • #8157:在 IE 中,聚焦已聚焦的文本字段将阻止 change 事件触发
  • #8728:当离开的元素在离开时被移除时,事件‘mouseenter’ 不会触发
  • #8789:元数据:事件属性钩子
  • #8858:特殊事件 – _default 方法无法访问 trigger 方法的 `data` 参数
  • #8866:IE8 input[type=file] 委托的 change 事件仅在失焦时触发
  • #8982:bind(“unload someOther”) => 在卸载时,处理程序仅执行一次。
  • #9069:当悬停在元素的子元素上时,使用 live 或 delegate 时,mouseleave 会触发
  • #9279:delegate() 绑定未正确处理选定元素的 mouseover/mouseout 和 mouseenter/mouseout
  • #9393:统一和 DRY 事件系统
  • #9593:委托的 submit 事件在 IE 中不是 jQuery.Event 的实例
  • #9724:当 window.parentNode 是 DOM 元素时,trigger 函数中存在无限循环
  • #9901:使用 .delegate 时,event.handleObj.namespace 不正确
  • #9933:jQuery.fn.toggle() 应在私有数据对象中存储状态
  • #9951:在 DOM 在处理程序中被修改时,.trigger() 中的顺序错误
  • #10375:不要在 jQuery.event.props 中包含 `type`
  • #10438:将 jQuery.event.propHooks 重命名为 .fixHooks
  • #10468:删除已过时的 jQuery.event.guid 和 jQuery.event.proxy
  • #10489:断开的元素在 .trigger() 时冒泡到窗口
  • #10531:考虑从 $.event.props 中删除 layerX 和 layerY
  • #10563:jQuery.Event 不再包含事件委托中匹配的选择器元素。
  • #10567:委托事件错误地匹配类名
  • #10575:1.6.4 和 1.7rc1 之间 live 事件传播的重大更改
  • #10576: jQuery1.7rc1 和 jQueryMobile1.0rc2 - IE 在 jqm triggerCustomEvent 方法中出现错误

操作

  • #6782: 谨慎允许更多字符串使用 innerHTML
  • #7037: 克隆元素添加了重复的 mouseover 和 mouseout 事件。
  • #10501: HTML5 元素“innerShiv”在 html()/append() 中不一致

杂项

  • #10420: MouseWheel
  • #10553: 进一步减少最小许可证标题

选择器

  • #3144: .text() 方法跨浏览器结果不一致
  • #5637: 布尔值(和空)属性选择器失败
  • #6863: 更快的 getText
  • #7128: 由于使用 DOM 属性,qSA 和 Sizzle 之间的属性选择器不一致
  • #8539: 在没有 querySelectorAll 的浏览器中,Sizzle 缓存冲突
  • #9261: 属性过滤器在 filter/children/siblings 中不起作用
  • #9570: 选择器 $(‘form[name=”..”]’) 在某些情况下在 IE8 中返回零个元素
  • #10178: $(window).is(“a”) >> 未捕获的 TypeError: Cannot call method ‘toLowerCase’ of undefined
  • #10315: Sizzle 在使用位置选择器时忽略种子参数
  • #10562: 当使用调用 Sizzle 的伪选择器时,siblings 方法返回意外的元素

支持

  • #5145: jQuery.support.opacity = false 在 Chrome 浏览器中
  • #6809: