如果你还没有听说,jQuery 大会 2011 将在本周末在波士顿举行。我们准备了一些东西,我们称之为 jQuery 1.7 Beta 1,我们将在大会上更多地讨论它。它拥有一系列令人愉悦的新功能和重要的错误修复——截至目前,已修复了 50 多个错误。
你可以从 jQuery CDN 获取 beta 版
请将这段代码放到你的现有应用程序中,并告诉我们是否有任何问题。请提交一个错误报告,并确保提及你正在使用 jQuery 1.7 BETA 1 进行测试。
此外,请务必探索所有新功能,看看你最讨厌的错误是否已经修复。如果你等到最终版本发布才进行测试,那么就太晚了!
一如既往,我们鼓励社区中的每个人尝试参与到 jQuery 核心贡献中。我们已经建立了一个完整页面的信息,专门用于帮助你更深入地参与到团队中。团队就在这里,随时准备帮助你帮助我们!
哦,你可能想知道发生了什么变化,对吧?Addy Osmani 在他的最新文章中已经做了一个很好的开始,所以让我们来看看他的文章中没有提到的内容。
新的事件 API:.on()
和 .off()
随着时间的推移,jQuery 已经演变出三种将事件附加到元素的方法:.bind()
、.live()
和 .delegate()
。但归根结底,这三个事件 API 都调用浏览器的事件系统;这会导致意想不到的交互。例如,$(document).unbind("click")
将删除所有 .live("click", ...)
事件,因为这些委托事件都附加到 document
。(这也是为什么你应该使用事件命名空间。)
我们目前的事件 API 不会很快消失,但为了解决我们引入的不一致性,我们引入了一对新的、简单的事件方法,它们可以完成所有三个方法的工作
$(elems).on(events, selector, data, fn); $(elems).off(events, selector, fn);
如果提供了一个 selector
,则它是一个委托事件;否则,它是一个直接绑定事件。所有旧 API 的功能都存在;例如,events
可以是一个用空格分隔的事件名称和/或命名空间字符串,或者可以是一个对象,其中键是事件,值是事件处理函数。以下是一些有关如何将旧方法映射到新方法的示例
旧 API | 新 API |
---|---|
$(elems).bind(events, fn) | $(elems).on(events, fn) |
$(elems).bind(events, { mydata: 42 }, fn) | $(elems).on(events, { mydata: 42 }, fn) |
$(elems).unbind(events, fn) | $(elems).off(events, fn) |
$(elems).delegate(selector, events, fn) | $(elems).on(events, selector, fn) |
$(elems).undelegate(selector, events, fn) | $(elems).off(events, selector, fn) |
$(selector).live(events, fn) | $(document).on(events, selector, fn) |
$(selector).die(events, fn) | $(document).off(events, selector, fn) |
IE 6/7/8 中的表单更改和提交事件
这些旧的 Internet Explorer 版本可能会困扰我们一段时间,所以我们花了一段时间来改进它们的行为。它们的事件传递性能得到了极大的提高,但最大的变化是,我们使用了不同的方法来修复它们的非冒泡和损坏的表单事件。因此,我们能够大大简化和缩短特殊事件代码。这些事件应该可以正常工作——甚至比以前更好,因为我们关闭了大约六个相关的错误——但请注意是否有任何异常行为。
动画改进
在 1.7 版本之前,如果你在动画完成之前停止了动画,它可能会导致正在被动画的元素永远无法恢复到其完整的大小;它基本上会卡在动画停止时的高度。我们通过在动画开始之前记住原始尺寸来解决这个问题,这样它们就可以在稍后使用。这消除了一种在使用某些动画(特别是切换动画)时的主要烦恼。
.removeData()
增强功能
Addy 也提到了这一点,但是 .removeData()
API 现在允许你传递一个用空格分隔的名称字符串或一个要删除的名称数组。由于以前在数据名称中允许使用空格,所以代码首先检查你指定的精确名称,然后才在空格处分割字符串。这样一来,不会因为这项增强功能而导致任何现有代码出现故障。
jQuery 1.7 BETA 1 变更日志
以下是 1.7 BETA 1 版本中所做更改的完整列表。
Ajax
- #9399: 弃用 jqXHR.success 和 jqXHR.error
属性
核心
Css
- #10267: IE8 和 window is(‘:visible’) 崩溃
数据
- #7323: 允许使用 $.fn.removeData 一次删除多个数据键
- #8909: $(element).data() 将扫描所有属性,而不仅仅是必要的属性。
- #8921: jQuery 私有数据应该保持私有
延迟
效果
- #5684: 效果:动画回调中的异常会导致无限循环
- #6150: .stop 有时不会清除 .delay
- #6641: 在动画完成回调中调用 stop() 会导致其他动画冻结
- #8685: 动画应该跟踪动画状态,以便正确地处理堆叠动画
- #9280: 允许为 animate() 设置多个效果队列
- #9548: animate 对 svg 元素的 fill-opacity css 属性不起作用
事件
- #3368: event.metaKey 应该只在非 Mac 系统上分配给 event.ctrlKey
- #6170: jQuery(window).scroll(); 会导致 IE* 滚动到 0,0
- #6319: 回归:IE 中更改处理程序中的 stopPropagation 错误地应用于 keydown 事件
- #6386: 通过 “event.special.live.add” 支持 live 事件的 data 参数
- #6593: IE8:当通过 jQuery 附加单独的处理程序时,DOM 0 事件处理程序被调用两次
- #6667: 提交事件在某些情况下无法在 IE* 中委托
- #6705: focus() 会导致焦点事件在 IE8 中被处理两次
- #6903: 特殊事件需要一种方法来确定它们是使用 .bind 还是 .live/.delegate 绑定。
- #6942: JQuery.event.fix 在 IE 中处理键事件时会导致不必要的重排
- #7139: “hover” 事件别名应该适用于 .bind 和 .live
- #7161: 表单元素上的提交事件在 IE 中未正确解除绑定
- #7444: 使用“Enter”而不是按钮点击提交表单在 ie8 或 ie7 中会触发 live 提交事件两次。
- #8157: 将焦点设置到已获得焦点的文本字段将阻止更改事件在 IE 中触发
- #8728: 当离开的元素被移除时,事件 ‘mouseenter’ 未触发
- #8789: 元数据:事件属性钩子
- #8858: 特殊事件——_default 方法无法访问 trigger 方法的 `data` 参数
- #8866: IE8 input[type=file] 委托更改事件仅在失焦时触发
- #8982: bind(“unload someOther”) => 在卸载时,处理程序不会只执行一次。
- #9069: 当悬停在元素的子元素上时,使用 live 或 delegate 时会触发 mouseleave
- #9279: delegate() bind 对选定元素的 mouseover/mouseout 和 mouseenter/mouseout 处理不正确
- #9393: 统一和 DRY 事件系统
- #9593: 委托的提交事件在 IE 中不是 jQuery.Event 的实例
- #9724: 当 window.parentNode 是 DOM 元素时,trigger 函数中出现无限循环
- #9901: 使用 .delegate 时,event.handleObj.namespace 不正确
- #9933: jQuery.fn.toggle() 应该将状态存储在私有数据对象中
- #9951: 当 DOM 在处理程序中被修改时,.trigger() 中的顺序错误
操作
选择器
- #5637: 布尔(和空)属性选择器失败
- #7128: 由于使用 DOM 属性,属性选择器在 qSA 和 Sizzle 之间不一致
- #9261: 属性选择器在 filter/children/siblings 中不起作用
- #9570: 选择器 $(‘form[name=”..”]’) 在某些情况下在 IE8 中返回零个元素
- #10178: $(window).is(“a”) >> 未捕获的 TypeError:无法调用未定义的 ‘toLowerCase’ 方法
- #10315: Sizzle 在使用位置选择器时忽略 seed 参数
支持
- #6809: 添加 jQuery.support.fixedPosition