我们很高兴宣布 jQuery 1.6 的第一个更新!
您可以从 jQuery CDN 获取代码
- jQuery 1.6.1 压缩并 gzip (用于生产)
- jQuery 1.6.1 未压缩 (用于测试)
此外,您还可以直接从 Microsoft 和 Google 的 CDN 加载 URL
Microsoft CDN: http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.1.min.js
Google CDN: https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.6.1/jquery.min.js
您可以通过将代码放到现有的应用程序中并告知我们是否有任何不再起作用的功能来帮助我们。请 提交错误,并确保提及您正在针对 jQuery 1.6.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()
。
请注意,1.6 版本说明中描述的关于 .data()
方法的更改已被解决,现在可以在 1.5.2 和 1.6.1 之间无缝工作。
更改内容
对属性模块的更改消除了属性和属性之间的歧义,但这在 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 不能具有属性。它们包含属性(例如 location 或 readyState),应该使用 .prop()
或简单的原生 JavaScript 来操作。在 jQuery 1.6.1 中,.attr()
将针对 window 和 document 的 .prop()
方法,而不是抛出错误。
其次,之前提到的 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);
来设置 checked 将不会选中复选框,因为需要设置的是属性,而您只是设置了初始值。
但是,在发布 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()
方法将在所有属性情况下起作用。
请注意,下面还列出了一些 DOM 元素属性 - 但只适用于新的 .prop()
方法。
属性/属性 | .attr() |
.prop() |
---|---|---|
accesskey | ✓ | |
align | ✓ | |
async | ✓ | ✓ |
autofocus | ✓ | ✓ |
checked | ✓ | ✓ |
class | ✓ | |
contenteditable | ✓ | |
defaultValue | ✓ | |
draggable | ✓ | |
href | ✓ | |
id | ✓ | |
label | ✓ | |
location * | ✓ | ✓ |
multiple | ✓ | ✓ |
nodeName | ✓ | |
nodeType | ✓ | |
readOnly | ✓ | ✓ |
rel | ✓ | |
selected | ✓ | ✓ |
selectedIndex | ✓ | |
src | ✓ | |
style | ✓ | |
tabindex | ✓ | |
tagName | ✓ | |
title | ✓ | |
type | ✓ | |
width ** | ✓ |
* 例如,对于 window.location
** 如果需要超过 .width()
.attr()
和 .prop()
都不能用于获取/设置value。请改用 .val()
方法(尽管使用 .attr(“value”, “somevalue”) 仍然有效,因为它在 1.6 之前有效)。
首选用法的总结
.prop()
方法应该用于布尔属性/属性以及不存在于 html 中的属性(如 window.location)。所有其他属性(您可以在 html 中看到的属性)都可以并且应该继续使用 .attr()
方法进行操作。
jQuery 1.6.1 更改日志
1.6.1 版本的当前更改日志。
属性
- #9071: $(‘<option></option>’).val(‘myValue’) 不再设置 value
- #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 会触发
操作
队列
- #9147: promise 中的变量 tmp 是隐式声明的?