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 中仍然存在,但我们建议你将.on()用于任何你已知使用 1.7 或更高版本的 jQuery 项目。以下是一些旧 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 兼容的加载器可以从 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),他是一位新手贡献者,已经为几个棘手的错误创建了补丁。非常感谢所有报告错误、提交 pull 请求、审查提交以及以其他方式确保我们尽最大努力的人。

尽管如此,我们总是需要更多帮助,而这就是你可以贡献的地方。你可以做的最简单也是最重要的就是偶尔将我们的正在进行中的工作与你的代码和你的预期进行测试。它始终位于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 中删除类属性

核心

  • #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() 应在窗口和文档上工作

效果

  • #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 事件文件只在失焦时触发
  • #8982: bind(“unload someOther”) => 在卸载时,处理程序不会只执行一次。
  • #9069: 当悬停在元素子元素上时,使用 live 或 delegate 时,mouseleave 会触发
  • #9279: delegate() bind 无法正确处理鼠标悬停/移出和鼠标移入/移出,用于选定元素
  • #9393: 统一和 DRY 事件系统
  • #9593: IE 中委托的 submit 事件不是 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: 鼠标滚轮
  • #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 在使用位置选择器时忽略 seed 参数
  • #10562: 当使用调用 Sizzle 的伪选择器时,siblings 方法返回意外的元素

支持

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

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

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

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

      谷歌:IE8 标准模式,闪光滚动条会出现问题。1.6.4 没有这个问题。

    3. mike nelson 说:

      通过对事件系统的完整重写,此版本还修复了自 v 1.4.0 以来存在的错误,即 jQuery 在 IE8 中触发多个 onchange 事件。这种情况发生在元素上同时存在内联“onchange”属性和 jQuery 绑定的“change”事件时。(jQuery 在 onbeforedeactivate 和某些版本中的 focusout 触发了额外的事件 - 它在 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 攻击了……。
      我的最后一条评论真的错过了重点 - 我对 rcleanScript 字符串的建议:"/^\s*<!(?:\[CDATA\[|\-\-)\s*(.*)\s*-->/"

    6. 我尝试使用 $(element).bind(“dragover, …..) 并希望使用 pageY 获取鼠标位置,但它无法获取。为什么?它可以使用 jQuery 1.6.4 -

    7. 很棒的作品。我越来越喜欢 jQuery 了。
      你能详细解释一下 `$.Callbacks()` 在实际中的应用吗?我对它不太了解。