jQuery 1.7 现已发布!您可以从 jQuery CDN 获取代码
此新版本也将在 Google 和 Microsoft CDN 上发布,只需一两天时间。
感谢您在测试和报告 beta 期间的错误,我们相信我们发布了一个稳定、可靠的版本。如果您发现问题,请提交错误,并确保在版本选择中选择 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 中仍然存在,但我们建议你对任何你已知使用版本 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
任何尝试使用 <section>
等新的 HTML5 标记的人无疑都遇到过这样的问题: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()
,因为它是一个有用的实用程序。将任何类型的参数传递给它,它将返回 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 私有数据应该保持私有
Deferred
- #8856: 请求:deferred.isUnresolved()
- #9033: IE8 中 try{ } finally{ } 错误
- #9398: 改进的 Deferreds 建议
尺寸
- #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: 在某些条件下,IE* 中的表单元素上的 submit 事件不会委托
- #6903: 特殊事件需要一种方法来确定它们是使用 .bind 还是 .live/.delegate 绑定
- #6942: JQuery.event.fix 在 IE 中处理键盘事件时会导致不必要的回流
- #7139: “hover” 事件别名应该适用于 .bind 和 .live
- #7161: 在 IE 中,表单元素上的 Submit 事件没有正确解绑
- #7444: 使用“Enter”而不是按钮点击在 ie8 或 ie7 上提交表单会触发 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 无法正确处理选定元素的 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: 在 .trigger() 中,当 DOM 在处理程序中修改时,顺序错误。
- #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:无法调用未定义的“toLowerCase”方法
- #10315: Sizzle 在使用位置选择器时忽略种子参数
- #10562: siblings 方法在使用 Sizzle 调用伪选择器时返回意外元素
支持
- #5145: 在 Chrome 浏览器中,jQuery.support.opacity = false
- #6809: