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()
,因为它是一个有用的实用程序。将任何类型的参数传递给它,它会根据情况返回 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 映射到编码
- #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’) 崩溃
数据
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() 中不一致
杂项
选择器
- #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 调用的伪选择器时返回意外的元素
很棒的工作!谢谢!
好样的!有没有办法让 4xx / 5xx XHR 响应仍然解析 JSON,以便 {error: “File size must be less than 10MB”} 不会抛出错误?我一直对 jQuery 的 AJAX 处理感到困扰。
@Clifton,任何事情都可以做......除了在博客中回答支持问题。试试 http://forum.jquery.com 吧。
激动人心!
感谢整个 jQuery 团队。
我对 $.Callbacks 感到非常兴奋
以下是 Addy Osmani 的一篇好文章
http://addyosmani.com/blog/jquery-1-7s-callbacks-feature-demystified/
我真的很不喜欢新的 .on() 方法。.bind() 和 delegate() 清楚地表明哪个元素实际上接收了事件操作,现在我必须查看 .on() 的参数才能知道事件是否被委托给不同的元素......不好......一点也不好。
@John Strickler
> .delegate() 和 .on() 具有相同的参数和语义,只是 .on() 始终将事件放在前面以保持一致性。
实际上 .delegate() 和 .on() 具有相同的参数和语义,只是 .on() 始终将事件放在前面以保持一致性。
@dmethvin
我的意思不是那个,我知道 delegate() 和 on() 非常相似。
当我看到 delegate() 时,我 100% 知道它是事件委托。
当我看到 on() 时,我必须查看是否传递了另一个字符串作为参数,才能知道它被委托了。
这将导致许多初学者犯错,甚至让中级 jQuery 开发者头疼。
你们那里有一个非常不错的更新列表。非常感谢,我喜欢你们的工作。
很棒的工作。jQuery 正在成为大型 HTML5 企业应用程序的伟大基础。
非常感谢你们伟大的工作!
很棒的工作,祝贺!J
感谢你们的辛勤工作!我们热爱 jQuery!
做得好!感谢您的辛勤付出!:)
确实非常棒的工作!非常感谢… 公司的 UX 因为你们而运行得很好。
非常感谢 jQuery 团队和贡献者!你们让网络变得更美好。
感谢您的辛勤付出,我会在 Google CDN 上可用时更新我的网站;)
谢谢!
希望 googleapis 尽快上线~
做得好!感谢您的辛勤付出!你们很棒!
太棒了!但是… 或许可以在首页添加一个指向“发布说明”的链接?我通过 Google 搜索才找到了这个页面… –> jQuery 1.7 的新特性。
文档网站: https://api.jqueryjs.cn/off/
网站上仍然是 jQuery 1.6.4,所以它失败了 :)
很有趣。打算用新的 on/off 开关玩一玩。顺便说一下,性能很出色。继续努力,各位!
哇,这太酷了。
继续努力!
太棒了,你们真是太棒了!
感谢团队和贡献者,你们通过委托事件实现了巨大的性能提升。证明了还有提升空间。
继续努力!
很棒的工作!每次新的迭代似乎都变得更快、更简洁,这让我们更轻松。
这真是太棒了,非常感谢!
很棒的工作!你们无法想象你们的贡献拯救了多少人的灵魂 :)
太棒了!我欠你们不止一个!
非常感谢
感谢您的辛勤付出,我们都非常喜欢 jQuery!
$.isNumeric() 是一个不错的补充。— 如果 JavaScript Date 对象也可以作为替代方案,我会遇到识别数字的问题。
这可能很明显,但 Date 对象似乎会解析为毫秒,因此 $.isNumeric(new Date()) 也是 TRUE(这在我的情况下不是我想要的)。
正在等待 googleapis 的更改…
一如既往,很棒的工作!
关于 Google CDN 更新有没有什么消息?
性能改进非常棒。感谢并继续努力!
很棒的改进工作!谢谢
太棒了!感谢全体团队!
巴西的问候!
jQuery 是最好的 JavaScript 库!谢谢!
感谢 isNumeric(),我一直讨厌 isNaN,它不直观,在思考逻辑时总是要对自己说“不是一个数字”。
你们真的太棒了。每次看到新版本,你们都能在如此少的代码中融入如此优雅的设计/架构和功能,我都惊叹不已。
Google Libraries API 仍然没有变化……
谢谢。jquery 很棒。
很棒的工作!我一直很喜欢查看新 jQuery 版本的性能图表。
但是,我注意到动画函数似乎不再正常工作了。你可以在这个网站上的 animate() 页面上看到它。
https://api.jqueryjs.cn/animate/
在第一个演示中,上面写着“Hello!”的那个,盒子只扩展到足以容纳“Hel”这两个字母,这在 Chrome(Comodo Dragon v15.0.3.0)和 Firefox(v8.0)的 Windows 7 Home x64 上都是这样。在 Firefox 上,动画完成后,剩下的字母闪烁着出现,但它们在包含它们的 div 之外,并且超过了它。
我注意到这个版本的 jQuery 引入了一些新的动画功能,想知道这是否是一个已知问题?我可能忽略了什么。
谢谢,继续你们出色的工作。
感谢你们的杰作!
Google CDN 链接仍然无法使用。
为什么更新 Google CDN 总是需要这么长时间?:(
jQuery 团队,干得漂亮!
我真的很长时间都在等待在切换动画中使用的初始大小,现在这将节省我几个小时。
Nick > 就像我在动画演示中看到的那样,这是 70% 的宽度,所以看起来效果不错。
$(“#go”).click(function(){
$(“#block”).animate({
width: “70%”,
…
}, 1500 );
});
看起来它现在已经在 Google 上了。
我也在 .animate() 函数将 % 转换为 px 时遇到问题,正如 @Nick 所说。
这在 Chrome 和 Firefox 中都是如此。
@John Strickler
> .delegate() 和 .on() 具有相同的参数和语义,只是 .on() 始终将事件放在前面以保持一致性。
我理解并同意你的所有观点。当 bind() 和 delegate() 自解释时,on() 需要我浏览它的参数才能确定所有特性。
这种泛化对我来说似乎很不寻常(在 jQuery 中)。内部实现是可以的,但我认为应该保留明确的多种方法用法。
请保留以前的方法好吗?
为什么 Google 返回的“Expires”头与请求发出时的时间相同?而在 1.6.4 中,它们返回的是一年后的时间。
感谢你们所有人的付出!如果我可以提出任何建议,那就是一件简单的事情和一件令人烦恼的事情。
1.) 简单的事情 - 在 API 中添加类似“myURL”(我自己工作中使用的插件)的东西,允许快速进行 jQuery 风格的网站 URL 调用(例如,$.myURL(“index”, “test”, “site”),将生成 http://thedomain.com/index.php/test/site)。
2.) 更多 IE 支持。当然,我不支持 IE,而且我个人也很讨厌它,但我的工作要求我尝试使我们的网站和软件兼容,而 jQuery 在 IE 的 v7-9 中总是会抛出几十个错误(尽管这次更新在 IE 9 中抛出的错误少了很多,但仍然需要对 IE 7 提供支持)。这迫使我不得不编写比我想要的更多的工作区和“替代”函数。
总之,再次感谢,这个库真是太棒了!