jQuery 1.7 Beta 1 发布

发布于

如果您还没有听说,jQuery 大会 2011 本周晚些时候将在波士顿举行。我们准备了一些东西,我们喜欢称之为 jQuery 1.7 Beta 1,我们将在大会上更多地讨论它。它拥有许多令人愉悦的新功能和重大错误修复——最后统计有超过 50 个。

您可以从 jQuery CDN 获取 beta 版

请帮助我们,将此代码放到您现有的应用程序中,并告知我们是否有任何功能不再正常工作。请提交错误报告,并确保提及您正在针对 jQuery 1.7 BETA 1 进行测试。

还要确保探索所有新功能,看看您最喜欢的恼人 bug 是否已修复。如果您等到最终版本再进行测试,那就太晚了!

与往常一样,我们希望鼓励社区中的每个人尝试并参与回馈 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

属性

  • #5479: removeAttr: 删除多个属性
  • #10278: checkboxEl.attr(‘checked’) 在 checkboxEl.click() 之后返回过时值

核心

  • #6485: IE 中的 HTML5 解决方案
  • #7102: 将 jQuery 注册为 CommonjS 异步模块
  • #9453: $.inArray 不支持 fromIndex

CSS

  • #10267: IE8 和 window is(‘:visible’) 崩溃

数据

  • #7323: 允许使用 $.fn.removeData 同时删除多个数据键
  • #8909: $(element).data() 将扫描所有属性,超出需要。
  • #8921: jQuery 私有数据应保持私有

延迟

  • #8856: 请求:deferred.isUnresolved()
  • #9033: IE8 中的 try{ } finally{ } 错误
  • #9398: 改进延迟的提议

效果

  • #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 中 change 处理程序内的 stopPropagation 错误地应用于 keydown 事件
  • #6386: 通过 “event.special.live.add” 支持 live 事件的 data 参数
  • #6593: IE8: 当通过 jQuery 附加单独的处理程序时,DOM 0 事件处理程序被调用两次
  • #6667: submit 事件在某些情况下在 IE* 中无法委托
  • #6705: focus() 会导致 focus 事件在 IE8 中被处理两次
  • #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 事件仅在失焦时触发
  • #8982: bind(“unload someOther”) => 在卸载时,处理程序仅执行一次。
  • #9069: 当悬停在元素的子元素上时,使用 live 或 delegate 时,mouseleave 会触发
  • #9279: delegate() 绑定未为选定元素正确处理 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: 在 .trigger() 中的错误顺序,当 DOM 在处理程序中被修改时

操作

  • #6782: 谨慎地允许更多字符串使用 innerHTML
  • #7037: 复制的元素中添加了重复的 mouseover 和 mouseout 事件。

选择器

  • #5637: 布尔(和空)属性选择器失败
  • #7128: 由于使用 DOM 属性,qSA 和 Sizzle 之间的属性选择器不一致
  • #9261: Has Attribute 在 filter/children/siblings 中不起作用
  • #9570: 选择器 $(‘form[name=”..”]’) 在某些情况下在 IE8 中返回零个元素
  • #10178: $(window).is(“a”) >> 未捕获的类型错误:无法调用未定义的“toLowerCase”方法
  • #10315: Sizzle 在使用位置选择器时忽略 seed 参数

支持

  • #6809: 添加 jQuery.support.fixedPosition

关于“jQuery 1.7 Beta 1 发布”的 23 个想法

  1. Prestaul 说:

    我喜欢新的事件 API!我们应该期待在某个时候看到对事件特定方法的委托支持吗?

    例如,$(elements).click(selector, fn)

    看起来这应该是向后兼容的。

  2. Someone 说:

    ” .removeData() API 现在允许您传递要删除的名称的空格分隔字符串或名称数组。由于以前在数据名称中允许空格,因此代码首先检查您指定的准确名称,然后再按空格拆分字符串。这样,由于此增强功能,任何现有代码都不会中断。”

    如果您调用 removeData( 'A B' ) 以确保您可能添加过或可能没有添加过的数据不再存在,该怎么办?如果数据不存在,这将等同于“removeData('A');removeData('B')”,而以前则不然。

  3. 我是不是弄错了,或者您事件示例中的 .delegate 签名与当前签名不同?

    在您的示例中,您为 .delegate 指定的签名是:

    (旧 API)
    $(elems).delegate(events, selector, fn)

    但在当前文档中,签名是:

    .delegate( selector, eventType, handler )

    看起来您把 selector 和 event 弄反了。这可能会使升级比简单地将 .delegate 更改为 .on 有更大的改变。

  4. 新的事件 API 是否将每个事件委托给?我没有其他解释,因为我看到所有 bind/delegate/live 都将更改为“on”。

  5. 一个小问题……如何强制执行此操作?

    function createSafeFragment( document ) {
    var nodeNames = (
    “abbr article aside audio canvas datalist details figcaption figure footer ” +
    “header hgroup mark meter nav output progress section summary time video”
    ).split( ” ” ),
    safeFrag = document.createDocumentFragment();

    if ( safeFrag.createElement ) {
    while ( nodeNames.length ) {
    safeFrag.createElement(
    nodeNames.pop()
    );
    }
    }
    return safeFrag;
    }

    ?

    我使用了一个简单的模拟器,并希望将其委托给 jQuery。

  6. 伙计们。我还没有使用 1.6,而你们刚刚发布了 1.7?这太棒了。你们不睡觉吗?你们不吃东西吗?:)

    出色的工作。感谢大家。

  7. 只是一个想法——jQuery.com 教程部分链接的大多数教程都非常古老——这些链接从我大约 4 年前开始学习 jQuery 以来就没有改变。到目前为止,它们仍然与时俱进,因为 jQuery API 这些年来一直非常稳定,但随着事件 API 被弃用,也许是时候更新/重定向到更新的教程了,因为它们会积极地鼓励人们使用旧的 API。

  8. Michael 说:

    我喜欢采用统一的方法来附加事件处理程序。但为什么新的方法签名不能添加到 bind 和 unbind 中?看起来不会发生冲突,而且 bind 和 unbind 比 on 和 off 清晰得多。

  9. 自从我在 jQuery 中了解到 $(element).live,我就不同意在 $(element) 层级绑定它们,而是希望在 $(document) 层级看到它。
    感谢将它们放在正确的范围。
    我的意思是 $(document).on(event, selector, fn);

  10. 你们发布版本的频率太快了,如果有人在一年前阅读了 jQuery 并尝试使用该方法,那么其中一些方法已经过时了。
    看来我们必须始终保持更新。