jQuery 1.6.1 RC 1 发布

发布日期 作者

我们即将发布 jQuery 1.6 的第一个更新——我们很高兴地宣布第一个候选版本发布!如果没有任何重大错误,这应该就是我们最终为 jQuery 1.6.1 发布的代码(将在本周进行)。

您可以从 jQuery CDN 获取代码

您可以帮助我们,将代码放入您现有的应用程序中,并告诉我们是否有任何内容不再起作用。请提交错误报告,并确保提及您正在针对 jQuery 1.6.1 RC 1 进行测试。

我们希望鼓励社区中的每个人尝试并参与回馈 jQuery 核心。我们已经建立了完整页面的信息,专门用于更深入地参与团队。团队在这里,随时准备帮助您帮助我们!

从 1.5.2 升级到 1.6.1

随着新.prop()方法的引入以及.attr()方法的更改,jQuery 1.6 引发了关于属性和属性之间的区别以及它们如何相互关联的讨论。它还带来了一些向后兼容性问题,这些问题在 1.6.1 中已得到修复。从 1.5.2 升级到 1.6.1 时,您无需更改任何代码。

以下是 jQuery 1.6 和 1.6.1 中属性模块更改的描述,以及.attr()方法和.prop()方法的首选用法。但是,如前所述,jQuery 1.6.1 允许您在所有情况下像以前一样使用.attr()

更改内容

属性模块的更改消除了属性和属性之间的歧义,但引起了 jQuery 社区的困惑,因为所有版本(早于 1.6)的 jQuery 都在一个方法(.attr())中处理了属性和属性。旧的.attr()方法有很多错误,难以维护。

jQuery 1.6.1 带来了几个错误修复,以及对属性模块的更新。

具体来说,在 1.6.1 中,诸如 checked、selected、readonly 和 disabled 之类的布尔属性将被视为与早于 1.6 的 jQuery 版本中的处理方式相同。这意味着诸如

$(“:checkbox”).attr(“checked”, true);
$(“option”).attr(“selected”, true);
$(“input”).attr(“readonly”, true);
$(“input”).attr(“disabled”, true);

甚至

if ( $(“:checkbox”).attr(“checked”) ) { /* Do something */ }

在 1.6.1 中无需更改,即可按预期工作。

为了使 jQuery 1.6 中对.attr()的更改更加清晰,以下是一些在 jQuery 的先前版本中有效的.attr()用例的示例,这些用例应改为使用.prop()

.attr() 正确的.prop()用法
$(window).attr… $(window).prop…
$(document).attr… $(document).prop…
$(“:checkbox”).attr(“checked”, true); $(“:checkbox”).prop(“checked”, true);
$(“option”).attr(“selected”, true); $(“option”).prop(“selected”, true);

首先,在 jQuery 1.6 中,对 window 或 document 使用.attr()方法不起作用,因为 window 和 document 不能具有属性。它们包含应使用.prop()或仅使用原始 JavaScript 操作的属性(如 location 或 readyState)。在 jQuery 1.6.1 中,.attr()将改为使用.prop()方法来处理 window 和 document,而不是抛出错误。

接下来,前面提到的 checked、selected 和其他布尔属性正在接受特殊处理,因为这些属性与它们对应的属性之间存在特殊关系。基本上,属性是您在 HTML 中看到的内容

<input type=”checkbox” checked=”checked”>

诸如 checked 之类的布尔属性仅设置默认值或初始值。在复选框的情况下,checked 属性设置页面加载时复选框是否应被选中。

属性是浏览器用来跟踪当前值的内容。通常,属性会反映它们对应的属性(如果存在)。布尔属性并非如此。当用户单击复选框或在选择元素中选择选项时,布尔属性会保持最新状态。相应的布尔属性不会。如上所述,它们仅由浏览器用于存储初始值。

$(“:checkbox”).get(0).checked = true;
// Is the same as $(":checkbox:first").prop(“checked”, true);

在 jQuery 1.6 中,使用

$(“:checkbox”).attr(“checked”, true);

不会选中复选框,因为需要设置的是属性,而您只设置了初始值。

但是,一旦发布了 jQuery 1.6,jQuery 团队意识到,设置浏览器仅在页面加载时关心的内容并没有特别的用处。因此,为了向后兼容性和.attr()方法的实用性,我们仍然能够在 jQuery 1.6.1 中使用.attr()方法来获取和设置这些布尔属性。

最常见的布尔属性是checked、selected、disabled 和 readOnly,但以下列出了 jQuery 1.6.1 支持使用.attr()动态获取和设置的布尔属性/属性的完整列表

autofocus, autoplay, async, checked, controls, defer, disabled,
hidden, loop, multiple, open, readonly, required, scoped, selected

仍然建议在设置这些布尔属性/属性时使用.prop(),但即使这些用例没有切换为使用.prop()方法,您的代码也将继续在 jQuery 1.6.1 中工作。

以下列出了一些属性和属性,以及在获取或设置它们时通常应使用哪种方法。这是首选用法,但.attr()方法在所有情况下都可以工作。

属性/属性 .attr() .prop()
accesskey
align
async
autofocus
checked
class
contenteditable
draggable
href
id
label
location (例如 window.location)
multiple
readOnly
rel
selected
src
tabindex
title
type
width(如果需要超过.width()

.attr().prop()都不应用于获取/设置value。请改用.val()方法(尽管使用 .attr(“value”, “somevalue”) 将继续起作用,就像在 1.6 之前一样)。

首选用法摘要

.prop()方法应用于布尔属性/属性,以及在 HTML 中不存在的属性(如 window.location)。所有其他属性(您可以在 HTML 中看到的属性)可以而且应该继续使用.attr()方法进行操作。

jQuery 1.6.1 RC 1 更改日志

当前 1.6.1 RC 1 版本的更改日志。

属性

  • #9079: .attr(“selected”) 在 1.6 中返回无用值
  • #9089: 1.6 atrr() 在 IE7、8 中不一致
  • #9094: jQuery 1.6 存在问题:无法取消选中复选框
  • #9103: .attr(‘foo’, true) 未设置相关的 DOM 属性
  • #9123: 当生成输入元素时,attr 方法的行为很奇怪。
  • #9129: jQuery 不支持诸如 contenteditable 之类的枚举属性
  • #9191: 单选按钮的 attr checked 错误

数据

  • #9124: $.data 的更改在某些情况下不合理
  • #9126: jquery 在使用 strict 时会中断

延迟

  • #9104: 在管道过滤器函数中返回 null 或 undefined 会导致异常

效果

  • #9074: 无法同时动画化位置和不透明度
  • #9100: hide() 回调的顺序已更改

事件

  • #9069: 当鼠标悬停在元素的子元素上时,使用 live 或 delegate 时,mouseleave 会触发

操作

  • #9072: jQuery 1.6 使 IE 6 崩溃

队列

  • #9147: 承诺中的变量 tmp 隐式声明?

选择器

  • #7341: IE 中的 .add() 速度很慢
  • #9096: jQuery 1.6 中的选择器或查找错误
  • #9154: :reset 伪选择器已损坏

支持

  • #8763: 未处理的异常:document.defaultView.getComputedStyle(div, null) 为 null(FF,隐藏的 iframe)
  • #9109: 即使不在怪癖模式下,support.boxModel 在 IE6 中也为 false

关于“jQuery 1.6.1 RC 1 发布”的 26 个想法

  1. alexander farkas 说道:

    @Razican

    attr/prop 表格有点误导性。可能经常有一些规则,可以说您必须对特定属性使用 prop 或 attr。但在某些情况下,您可以同时使用两者,而在其他一些情况下,这确实取决于您想要获取什么。

    HTML 规范区分了内容属性(HTML 属性)和 idl 属性(属性),还区分了反映和非反映属性。 (http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect)

    checked、value 和 selected 属性是非反映属性,因此您始终必须使用 prop。

    大多数属性,例如 name(参见 @ http://www.w3.org/TR/html5/association-of-controls-and-forms.html#attr-fe-name)、disabled (http://www.w3.org/TR/html5/association-of-controls-and-forms.html#attr-fe-disabled)、id、title、required、controls 等是反映属性,这意味着您可以使用 attr/removeAttr 或 prop(对于这些属性,不应该有 jQuery 规则说您必须使用 prop 或 attr)。

    在 type 属性的情况下,该表似乎有点奇怪。属性始终返回“计算”类型,而内容属性可能会返回一些无意义的值。

    例如

    // attr 返回 undefined,而 prop 正确返回 text

    // 或

    // attr 返回 TEXT,而 prop 返回 text

  2. 感谢您倾听用户的声音并恢复 attr。很高兴知道我们不是在自言自语。很棒的回应,很棒的版本!

  3. Cristóvão Morgado on 说:

    很好,我一直都在与 query mobile 中的 checked prop 问题作斗争...
    希望一切都按计划进行,因为 query + mobile + template 是我的日常工具 :-)

  4. Alistair B on 说:

    我不确定将 prop 和 attr 分开的好处。jQuery 不是旨在抽象掉这样的细微差别吗?

    不过,很高兴看到 attr 能够像 1.5 版本一样在所有情况下都能正常工作,感谢。

    另外,如果您能说明首选用法以及 prop 的好处,那将非常有用。您列出的几乎所有属性(例如 'multiple')都可以在 HTML 中存在,所以我感到困惑。

  5. alexander farkas on 说:

    @Alistair B

    绝对有必要将这两者分开,因为 jQuery 无法简单地决定开发人员想要获取/设置哪种属性。

    但你也有道理:旧的 $.attr 被设计为在有属性的情况下始终使用属性。现在有 $.prop 来做这件事,而 $.attr 是旧 attr 和一个简单的 setAttribute 的混合。尽管旧的 jQuery 使用属性来设置 title 属性,但他们现在说,我必须使用 $.attr,而不是 $.prop。(有点令人困惑)。

    从我的角度来看,最好引入两个新方法(prop 和 htmlAttr),而 $.attr 应该只使用旧的区分逻辑路由到这些新方法。

  6. @Alistair

    表中几乎所有内容都是属性和属性。正如您指出的那样,您可以在 html 中看到 multiple,但还有一个名为 multiple 的属性,您看不到它,而这正是您真正想要设置的。属性本身只设置默认值。您想设置当前值,该值只能通过设置属性来设置(attr 现在也这样做,但如果您使用 prop,它会更快)。这仅适用于布尔属性/属性。这篇文章中都解释了。

    @afarkas

    我认为您把它想得太复杂了。过去 attr 用于设置 title,现在 attr 应该用于设置 title。只是现在,title 以符合规范的方式设置,并且总体上至少快了两倍。我不会说旧的 attr 被设计为始终使用属性,也不会说新的 attr 是旧 attr 和一个“简单”的 setAttribute 的混合。不需要另一个函数。

  7. alexander farkas on 说:

    1. 规范
    HTML 规范中没有任何部分说明您应该使用 setAttribute 更改 title 属性,并且不允许您使用属性/属性 idl 设置 title 属性。

    规范描述了反射的工作原理,这意味着开发人员可以选择在这两种情况下使用属性或内容属性。上面表中大多数属性都是反射属性,开发人员没有理由在这些情况下优先使用 attr 而不是 prop。

    2. 性能
    是的,1.6.x $.attr 比 jQuery 1.5.x $.attr 快,但这与属性访问与内容属性访问无关。事实上,在任何浏览器中,使用 $.prop 设置/获取 title 属性都比使用 $.attr 设置/获取 title 快 20%-30%。 http://jsperf.com/prop-vs-attr

    说过去 attr 可以用于 title 现在也可以,这绝对没问题。但您说:对于 title 属性,使用 $.attr,不要使用 $.prop。

    但是 $.prop 也符合规范,而且速度更快,这就是我的问题。

    在 type 属性的情况下,我已经明确说明使用 $.attr 会遇到一些问题,而您只能通过使用 prop 来解决这些问题。而且,我不想让您在 $.attr 中使用属性来获取 type 属性。

  8. 我仍然在这些更改方面遇到问题,但没有机会跟踪所有来自依赖库的问题。
    无论如何,这看起来很棒,而且更有意义!感谢您的辛勤工作!

  9. scrollTop() 和 scrollLeft() 在 IE7 中存在问题,我不知道为什么 scrollTop()、scrollLeft 无法在 IE7 中读取,而其他浏览器没有这个问题...

  10. 我没有查看代码更改,所以我不了解引入的开销... 但不应该实现这个 attr “修复”吗?

    你们决定引入 prop(),在很多方面它很有道理 - 尽管引入得太晚了...

    但现在人们会继续对所有内容使用 attr(),而代码现在将有一些开销来检查/调用 prop() 用于这个“特殊情况”...

  11. @Kaitlyn

    有两种看待它的方式。使用 jQuery 1.6,您最终会遇到很多不兼容的插件,只要它们没有更新 - 以及很多会崩溃的网站,因为它们会升级到 1.6,而没有确保修复其代码。
    使用 jQuery 1.6.1,更新的插件将使用 .prop(),因此不会有任何性能影响,而过时的插件仍将正常工作。网站也将继续工作。我同意应该在 v1.6 中以这种方式完成。当您的库被数百万用户使用时,需要勇气才能打破一个流行的功能。我很佩服 jQuery 这样做了 - 但我更佩服他们回头选择了更明智的解决方案。

  12. 非常感谢!
    我发现了一点问题...
    jq1.6、jq1.6.1 仅在 IE9 中存在内存泄漏..
    其他浏览器没有问题(已测试 Firefox、Chrome、IE8)。

    1. 加载页面!!!— 33MB
    2. 按 F5 键(重新加载)— 36MB
    3. 按 F5 键(重新加载)— 39MB
    …. 一直增加!!!

  13. Yann Dìnendal 说:

    酷!没有 1.6 的重大变更,感觉好多了。我之前只在 .attr(“defaultValue”) 上遇到了问题,但现在用 .prop() 确实更好。

  14. Radu Badea 说:

    选择控件的 ‘selectedIndex’ 怎么样?它在 1.6.1 版本中似乎无法正常工作,但在 1.6 之前的版本中则可以正常工作。

  15. 嗨,上面的表格有点误导性。我使用的是 jQuery 1.6.4,当我尝试 attr(‘type’) 时,它返回 undefined,但用 prop 我得到了 ‘select-one’。而在表格中,attr 列中勾选了 type。