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 错误
数据
延迟
- #9104: 在管道过滤器函数中返回 null 或 undefined 会导致异常
效果
事件
- #9069: 当鼠标悬停在元素的子元素上时,使用 live 或 delegate 时,mouseleave 会触发
操作
- #9072: jQuery 1.6 使 IE 6 崩溃
队列
- #9147: 承诺中的变量 tmp 隐式声明?
选择器
支持
- #8763: 未处理的异常:document.defaultView.getComputedStyle(div, null) 为 null(FF,隐藏的 iframe)
- #9109: 即使不在怪癖模式下,support.boxModel 在 IE6 中也为 false
哇,这比我预期的要快得多!
恭喜!
这是一个巨大的改进!但我一直在考虑 .attr(‘disabled’, true)。我们应该继续使用它还是使用 .prop()?
抱歉,没有读框。但是 name 属性呢?
@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
@Razican:name 将继续与 .attr() 正常工作。
感谢您倾听用户的声音并恢复 attr。很高兴知道我们不是在自言自语。很棒的回应,很棒的版本!
很好,我一直都在与 query mobile 中的 checked prop 问题作斗争...
希望一切都按计划进行,因为 query + mobile + template 是我的日常工具 :-)
我不确定将 prop 和 attr 分开的好处。jQuery 不是旨在抽象掉这样的细微差别吗?
不过,很高兴看到 attr 能够像 1.5 版本一样在所有情况下都能正常工作,感谢。
另外,如果您能说明首选用法以及 prop 的好处,那将非常有用。您列出的几乎所有属性(例如 'multiple')都可以在 HTML 中存在,所以我感到困惑。
@Alistair B
绝对有必要将这两者分开,因为 jQuery 无法简单地决定开发人员想要获取/设置哪种属性。
但你也有道理:旧的 $.attr 被设计为在有属性的情况下始终使用属性。现在有 $.prop 来做这件事,而 $.attr 是旧 attr 和一个简单的 setAttribute 的混合。尽管旧的 jQuery 使用属性来设置 title 属性,但他们现在说,我必须使用 $.attr,而不是 $.prop。(有点令人困惑)。
从我的角度来看,最好引入两个新方法(prop 和 htmlAttr),而 $.attr 应该只使用旧的区分逻辑路由到这些新方法。
@Alistair
表中几乎所有内容都是属性和属性。正如您指出的那样,您可以在 html 中看到 multiple,但还有一个名为 multiple 的属性,您看不到它,而这正是您真正想要设置的。属性本身只设置默认值。您想设置当前值,该值只能通过设置属性来设置(attr 现在也这样做,但如果您使用 prop,它会更快)。这仅适用于布尔属性/属性。这篇文章中都解释了。
@afarkas
我认为您把它想得太复杂了。过去 attr 用于设置 title,现在 attr 应该用于设置 title。只是现在,title 以符合规范的方式设置,并且总体上至少快了两倍。我不会说旧的 attr 被设计为始终使用属性,也不会说新的 attr 是旧 attr 和一个“简单”的 setAttribute 的混合。不需要另一个函数。
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 属性。
我仍然在这些更改方面遇到问题,但没有机会跟踪所有来自依赖库的问题。
无论如何,这看起来很棒,而且更有意义!感谢您的辛勤工作!
scrollTop() 和 scrollLeft() 在 IE7 中存在问题,我不知道为什么 scrollTop()、scrollLeft 无法在 IE7 中读取,而其他浏览器没有这个问题...
它可以在 jquery1.52 中成功运行,但当我升级到 1.6 时,它失败了
我没有查看代码更改,所以我不了解引入的开销... 但不应该实现这个 attr “修复”吗?
你们决定引入 prop(),在很多方面它很有道理 - 尽管引入得太晚了...
但现在人们会继续对所有内容使用 attr(),而代码现在将有一些开销来检查/调用 prop() 用于这个“特殊情况”...
@Kaitlyn
有两种看待它的方式。使用 jQuery 1.6,您最终会遇到很多不兼容的插件,只要它们没有更新 - 以及很多会崩溃的网站,因为它们会升级到 1.6,而没有确保修复其代码。
使用 jQuery 1.6.1,更新的插件将使用 .prop(),因此不会有任何性能影响,而过时的插件仍将正常工作。网站也将继续工作。我同意应该在 v1.6 中以这种方式完成。当您的库被数百万用户使用时,需要勇气才能打破一个流行的功能。我很佩服 jQuery 这样做了 - 但我更佩服他们回头选择了更明智的解决方案。
非常感谢!
我发现了一点问题...
jq1.6、jq1.6.1 仅在 IE9 中存在内存泄漏..
其他浏览器没有问题(已测试 Firefox、Chrome、IE8)。
1. 加载页面!!!— 33MB
2. 按 F5 键(重新加载)— 36MB
3. 按 F5 键(重新加载)— 39MB
…. 一直增加!!!
感谢分享?
———————————-
http://www.hoganscarpehogan.com/
酷!没有 1.6 的重大变更,感觉好多了。我之前只在 .attr(“defaultValue”) 上遇到了问题,但现在用 .prop() 确实更好。
为什么这个 bug 在每个新版本发布的修复列表中似乎从未出现过?它很严重,而且已经存在了六个月。对 Sizzle 的修正也很简单。我越来越厌倦打补丁,以便确保 “has attribute” 在 IE 中正常工作……
http://bugs.jquery.com/ticket/7770
在 IE6、IE7 或 Firefox 3 中运行这段代码
http://jsfiddle.net/QwtUQ/2/
选择控件的 ‘selectedIndex’ 怎么样?它在 1.6.1 版本中似乎无法正常工作,但在 1.6 之前的版本中则可以正常工作。
非常好ooooooooooo
感觉很好
谢谢。
可能很快就要更新。必须先测试。
不错!agregador de link
嗨,上面的表格有点误导性。我使用的是 jQuery 1.6.4,当我尝试 attr(‘type’) 时,它返回 undefined,但用 prop 我得到了 ‘select-one’。而在表格中,attr 列中勾选了 type。