【翻译】Jquery 1.7 发布
原文:http://blog.jquery.com/2011/11/03/jquery-1-7-released/
jQuery 1.7已经可以下载!您可以从jQuery CDN获取代码:
http://code.jquery.com/jquery-1.7.js
http://code.jquery.com/jquery-1.7.min.js
这个新版本在谷歌和微软的CDN也将在一两天后可用。
感谢你们在试用期的测试和错误报告,我们相信现在我们已经有了一个稳定的版本。如果您发现问题,提交bug并确保您选择的是jQuery 1.7版本。同时请务必提供jsFiddle的测试案例以帮助我们快速的分析问题。
JQUERY 1.7的新特性
使用API网站提供的版本1.7 tag可以快速的查看这个版本中的新特性。这里逐条介绍1.7中的一些重要更新,以及在API文档中没有提到的内容。
新事件 API: .on() 和 .off()
新的 .on() 和 .off() API 统一了jQuery中所有对文档绑定事件的操作——而且它们也更加简短!
$(elements).on( events [, selector] [, data] , handler ); $(elements).off( [ events ] [, selector] [, handler] );
当提供一个selector参数时, .on() 根据选择器过滤,并绑定一个委派的事件处理程序,类似于 .delegate() 。当这个参数被忽略或为null时则类似于 .bind() 。其中有一个模棱两可的情况:当data参数是一个字符串时,你必须提供一个selector字符串或null,使data参数不被误认为 selector参数。传递一个对象给data参数,你可以不用再担心这一特殊情况。
1.7所有现有的事件绑定方法(及其相应的解除绑定的方法)仍然存在,但我们推荐您在使用1.7或更高版本的时候使用 .on() 。以下是在新旧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和Sproutcore一样的应用框架大量的使用了事件委托。考虑到这一点,jQuery 1.7的事件处理被重构以使委派事件更加迅速,尤其是在大多数常见情况下。
为了优化最常用的选择器形式的代码,我们研究了Google Codesearch上的代码截面。近三分之二在 .live() 和 .delegate() 方法调用中使用的选择器,至少使用了tag,id,class中的一个形成tag#id.class的形式。通过分析在JavaScript中这些简单选 择器在事件绑定时的状态,我们在事件传递时甚至可以超越浏览器原生实现matchesSelector的性能。对于更复杂的选择器,我们仍然使用 Sizzle引擎,所以现有的代码仍然可以继续运行。
最终委托事件和1.6.4相比,节省了大约一半的时间:
更好的支持IE6/7/8中的HTML5
任何试图在IE 6/7/8中使用新的类似于<section>的HTML5标签的人,毫无疑问都会遇到IE 6/7/8无法解析这些标签,甚至将这些标签从文档中移除的问题。在jQuery 1.7中,我们为较旧IE版本中 .html() 一类的方法建立了对HTML5的支持。这一功能和以前的innerShiv相同。您仍然需要在您的文档头部加入HTML5Shiv以使旧IE版本支持HTML5标签。需要更多背景资料,请查看The Story of the HTML5 Shiv。
切换动画更直观
在jQuery的旧版本中,类似于 .slideToggle() 或 .fadeToggle() 的切换动画在互相堆放和前一个动画被 .stop() 终止时无法正常工作。在1.7中这一情况被修复,动画系统会记住元素的初始值并在一个切换的动画被提前终止的情况下重置它们。
异步模块定义(AMD)
现在jQuery支持AMD API。 请注意jQuery 1.7并不是脚本装载器本身;它是和RequireJS 或curl.js等AMD兼容的装载器合作以使它可以动态加载并使用装载器控制ready事件。现在一个AMD兼容的装载器可以从谷歌或微软的CDN加载 一个jQuery 1.7的未经修改的版本。非常感谢James Burke (@jrburke) 提交的补丁和单元测试,然后耐心的等待我们纳入此功能。
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方法以代替。