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
不被误认为是选择器。将对象传递给 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
的形式,其中 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()
,因为它是一个有用的工具。将任何类型的参数传递给它,它都会返回 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 中删除类属性
核心
- #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 事件提供 data 参数支持
- #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 无法为选定元素正确处理 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() 中不一致
杂项
选择器
- #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: