jQuery 1.7 发布

发布于 作者

jQuery 1.7 现已发布!您可以从 jQuery CDN 获取代码

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

感谢您在测试和报告测试版期间的帮助,我们相信我们发布了一个稳定可靠的版本。如果您发现问题,请提交错误,并确保在版本选择中选择 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,您将永远不必担心特殊情况。

所有现有的事件绑定方法(及其对应的取消绑定方法)在 1.7 中仍然存在,但我们建议您在任何新的 jQuery 项目中使用 .on(),只要您知道使用的是 1.7 或更高版本。以下是旧 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 代码搜索中的代码样本。近三分之二的 .live().delegate() 方法调用中使用的选择器都采用 tag#id.class 形式,其中 tag、id 或 class 中的一个或多个被使用。通过在附加事件时在 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 兼容的加载器可以从 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 (timmywil on Github)、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 私有数据应保持私有

Deferred

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

尺寸

  • #9434:.outerWidth()/.outerHeight()/.innerWidth()/.innerHeight() 应该在 window 和 document 上工作

效果

  • #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 事件的数据参数
  • #6593: IE8:当通过 jQuery 附加单独的处理程序时,DOM 0 事件处理程序被调用两次
  • #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 事件仅在 blur 时触发文件
  • #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: 不要将 `type` 包含在 jQuery.event.props 中
  • #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: Has Attribute 在 filter/children/siblings 中不起作用
  • #9570: 选择器 $(‘form[name=”..”]’) 在某些情况下在 IE8 中返回零个元素
  • #10178: $(window).is(“a”) >> 未捕获的 TypeError:无法调用未定义的方法“toLowerCase”
  • #10315: Sizzle 在使用位置选择器时忽略种子参数
  • #10562: siblings 方法在使用 Sizzle 调用的伪选择器时返回意外的元素

支持

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

    关于“jQuery 1.7 已发布”的 62 条评论

    1. 另一方面,.isNumeric 很不错,但到 2.0,我真的很想看到所有(或尽可能多)“is”情况的实现,例如“isBool”和“isObject”。
      为了进一步澄清,“isObject”会更好,如果你可以在(参数中)指定检查它是否是一个 json 对象或数组对象,等等。

    2. html,body{ height:100%; width:100%; border:0px; }

      google:IE8 标准模式,出现 Flash 滚动条问题。1.6.4 没有这个问题。

    3. mike nelson 说:

      在这个版本中,事件系统的完整重写还修复了一个自 v 1.4.0 就存在于 jQuery 中的错误,该错误导致 jQuery 在 IE8 中触发多个 onchange 事件。这发生在元素上同时存在内联“onchange”属性和 jQuery 绑定的“change”事件的情况下。(jQuery 在 onbeforedeactivate 和某些版本中触发了额外的焦点 - 在 v 1.3.2 中没有这样做。)

      我注意到这个错误实际上并未列在已修复的错误中,但它确实被修复了!!

    4. pål a olsen 说:

      嗨,

      我有一个 IE8 问题……。长话短说,我们使用 .each(),
      并且由于意外,此函数使用旧的著名方法扫描了一些自动生成的 javascript- 产生了著名的“由于错误 80020101 无法完成操作”消息。
      在我看来,rcleanScript 正则表达式是为了删除注释标签而做出的努力,但它失败了……。部分原因是正则表达式不完整,部分原因是替换字符串(“/*$0*/”)不好。

      rcleanScript 不应该看起来更像“^\s*$”,并且替换字符串应该是“$1”吗……。

      -pål-

    5. pål a olsen 说:

      哎呀……。似乎我被 owasp’ed 了……。
      我上一个评论真的错过了重点 - 我对 rcleanScript 字符串的建议:"/^\s*<!(?:\[CDATA\[|\-\-)\s*(.*)\s*-->/"

    6. 我尝试使用 $(element).bind(“dragover, …..) 并想用 pageY 获取鼠标位置,但它做不到。为什么?它在 jQuery 1.6.4 中可以。

    7. 很棒的工作。我越来越喜欢 jQuery 了。
      你能详细讲解一下 `$.Callbacks()` 在实际中的应用吗?我还没有完全理解它。