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()
,因为它是一个有用的实用程序。将任何类型的参数传递给它,它将返回相应的 true
或 false
。
已删除的功能
event.layerX 和 event.layerY:我们在 1.7 版中已删除这些非标准属性。虽然我们通常会为这些属性执行过时通知期,但 Chrome 16 版会在页面上生成大量 控制台警告消息。因此,我们决定立即将其删除。在仍然支持这些属性的平台上,可以通过 event.originalEvent.layerX
和 event.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() 中不一致
杂项
选择器
- #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: