jQuery 1.7 发布

发布于 作者

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 中仍然存在,但我们建议您在任何新的 jQuery 项目中使用 .on(),其中您知道使用的是版本 1.7 或更高版本。以下是一些将旧 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(),因为它是一个有用的实用程序。将任何类型的参数传递给它,它会根据情况返回 truefalse

已删除的功能

event.layerX 和 event.layerY:我们在 1.7 版本中删除了这些非标准属性。虽然我们通常会为这些属性经历一个弃用通知阶段,但 Chrome 16 版本在页面上生成了大量控制台警告消息。由于此原因,我们决定立即将其删除。在仍然支持这些属性的平台上,可以通过 event.originalEvent.layerXevent.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 映射到编码
  • #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:改进的 Deferred 的建议

尺寸

  • #9434:.outerWidth()/.outerHeight()/.innerWidth()/.innerHeight() 应在窗口和文档上工作

效果

  • #5684:效果:动画回调中的异常导致无限循环
  • #6150:.stop 有时无法清除 .delay
  • #6641:在动画完成回调中调用 stop() 会导致其他动画冻结
  • #8685:动画应跟踪动画状态以正确处理堆叠动画
  • #9280:允许为 animate() 设置多个效果队列
  • #9548:animate 不适用于 svg 元素的 fill-opacity css 属性
  • #10445: 将队列设置为 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: 使用“Enter”而不是按钮点击在 ie8 或 ie7 上提交表单会触发 live submit 事件两次。
  • #8157: 在 IE 中,将焦点集中到已经聚焦的文本字段将阻止 change 事件触发
  • #8728: 当离开的元素在离开时被移除时,事件“mouseenter”没有触发
  • #8789: 元数据:事件属性钩子
  • #8858: 特殊事件 - _default 方法无法访问 trigger 方法的 `data` 参数
  • #8866: IE8 input[type=file] 委托的 change 事件文件仅在 blur 时
  • #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() 中不一致

杂项

  • #10420: 鼠标滚轮
  • #10553: 进一步减少最小许可证标题

选择器

  • #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 使用位置选择器时忽略种子参数
  • #10562: siblings 方法在使用 Sizzle 调用的伪选择器时返回意外的元素

支持