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 中,但我们建议您在任何使用 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 的文档的 <head> 中包含 html5shiv (或 Modernizr) 以获得 HTML5 标签支持。 有关更多背景信息,请参阅 HTML5 Shiv 的故事。
切换动画直观地工作
在以前版本的 jQuery 中,诸如 .slideToggle() 或 .fadeToggle() 之类的切换动画在动画相互堆叠且先前的动画使用 .stop() 终止时无法正常工作。这已在 1.7 中 修复,因此动画系统会记住元素的初始值并在切换动画过早终止的情况下重置它们。
异步模块定义 (AMD)
jQuery 现在支持 AMD API。请注意,jQuery 1.7 本身不是脚本加载器;它与 AMD 兼容的加载器(如 RequireJS 或 curl.js)配合使用,以便可以动态加载它,并且加载器可以控制 ready 事件。
jQuery.Deferred
jQuery.Deferred 对象已扩展了新的进度处理程序和通知方法,这些方法会调用这些处理程序。这允许您异步通知监听器请求的进度,而无需解析或拒绝请求。此外,还有一个新的 state() 方法,它返回 Deferred 的当前状态;它主要用于调试。
Deferreds 现在使用新的 jQuery.Callbacks 功能实现,这是一种排队和触发一系列处理程序的一种通用方法。此功能可能对插件编写者感兴趣,尽管 Deferreds 和事件子系统为此类功能提供了一个更高级别的接口。
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 (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 映射到编码,具体取决于浏览器
- #10176:注入的 script 标签被评估两次
- #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:try{ } finally{ } 在 IE8 中出现错误
- #9398:改进 Deferreds 的建议
Dimensions
- #9434:.outerWidth()/.outerHeight()/.innerWidth()/.innerHeight() 应适用于 window 和 document
Effects
- #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 会导致在处理关键事件时出现不必要的重绘
- #7139:“hover”事件别名应适用于 .bind 以及 .live
- #7161:表单元素上的提交事件在 IE 中未正确解绑
- #7444:使用“Enter”而不是按钮单击提交表单时,IE8 或 IE7 会触发 live 提交事件两次。
- #8157:聚焦一个已经聚焦的文本字段会阻止 change 事件在 IE 中触发
- #8728:当离开的元素被移除时,mouseenter 事件不会触发
- #8789:Meta:事件属性挂钩
- #8858:特殊事件 – _default 方法无法访问 trigger 方法的数据参数
- #8866:IE8 input[type=file] 委托的 change 事件文件仅在 blur 时触发
- #8982:bind(“unload someOther”) => 在卸载时,处理程序不会只执行一次。
- #9069:当鼠标悬停在元素的子元素上时,使用 live 或 delegate 会触发 mouseleave
- #9279:delegate() bind 无法正确处理所选元素的 mouseover/mouseout 和 mouseenter/mouseout
- #9393:统一和简化事件系统
- #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() 上冒泡到 window
- #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:siblings 方法在使用 Sizzle 调用伪选择器时返回意外元素
支持
- #5145:jQuery.support.opacity = false 在 Chrome 浏览器中
- #6809: