jQuery 1.6.1 发布

发表于

我们很高兴地宣布 jQuery 1.6 的第一个更新!

您可以从 jQuery CDN 获取代码

此外,您还可以直接从 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

您可以通过将代码放到现有应用程序中并告诉我们是否出现任何问题来帮助我们。请提交 bug,并确保提到您正在针对 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 中,在窗口或文档上使用.attr()方法不起作用,因为窗口和文档不能具有属性。它们包含属性(如 location 或 readyState),这些属性应该使用.prop()或简单的原生 javascript 来操作。在 jQuery 1.6.1 中,.attr()将委托给窗口和文档的.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);

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

但是,在发布 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()

获取/设置value不应使用.attr().prop()。请改用.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 错误

数据

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

延迟

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

效果

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

事件

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

操作

  • #9072: jQuery 1.6 使 IE 6 崩溃
  • #9221: AJAX 中的 Javascript 无法在 IE 中加载 - 错误 80020101

队列

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

选择器

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

支持

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

关于“jQuery 1.6.1 发布”的 36 则评论

  1. TonyR 说:

    您说“不要使用 .attr() 或 .prop() 获取/设置值。请改用 .val() 方法(尽管使用 .attr(“value”, “somevalue”) 仍然有效,就像 1.6 版本之前一样)”。但是,当我尝试像这样使用 val() 方法时 $(“#subscribe:checked”).val(false) 它不起作用 - 它返回“undefined”,那我应该如何使用它呢?1.6 版本之前的方法可以正常工作。

  2. Klaas 说:

    您好,

    您是否更改了任何与浏览器中的缓存和前后导航相关的 issue?我在页面之间导航并点击后退按钮时遇到问题。我在 page1.html 上进行了 ajax 和 DOM 操作,跳转到 page2.html,然后点击后退按钮,页面会正常重新加载。现在 jQuery 似乎直接返回到页面一而不重新加载,只是从缓存中显示页面(在通过后退按钮返回 page1.html 后,window.load 中没有抛出任何警报,并且它会滚动到正确的位置)。

    我在更改日志中没有看到任何内容,但了解是否有什么变化会很棒。我还会检查一下我是否进行了任何代码更改。

    敬礼,
    klaas

  3. Damian 说:

    Hola, 我一直使用 jquery-1.4.2.js,并且从未更新它,因为我在使用 jQuery 自动完成时遇到了问题。
    虽然列表显示得很好,但我想知道如何让它(在自动完成中)根据输入的字符进行搜索,就像我现在在我的网站 (http://www.glosarioit.com,我想使用 jquery-1-6-1 版本更新它) 上那样,而不是在输入“ar”时显示“Adware,AppleShare,etc.”,而是显示“Arrays, ARPA, etc.”,也就是说,要考虑单词的第一个字符,而不是它们是否在中间或结尾。
    此外,我还希望它列出有或没有重音符号的词语,并保持一致(我知道英语中不使用重音符号,但在西班牙语中使用)。
    我希望您能理解我的意思。

  4. Damian 说:

    您好,我一直使用 jquery-1.4.2.js,并且从未更新它,因为我在使用 jQuery 自动完成时遇到了问题。
    虽然列表显示得很好,但我想知道如何让它(在自动完成中)根据输入的字符进行搜索,就像我现在在我的网站 (http://www.glosarioit.com,我想使用 jquery-1-6-1 版本更新它) 上那样,而不是在输入“ar”时显示“Adware, AppleShare, 等等”,而是显示“Arrays, ARPA, 等等”,也就是说,要考虑单词的第一个字符,而不是它们是否在中间或结尾。
    此外,我还希望它列出有或没有重音符号的词语,并保持一致(我知道英语中不使用重音符号,但在西班牙语中使用)。
    我的英语不好,请见谅,我希望您能理解我的意思。

  5. Larry A 说:

    您好!

    1.6.1 版本在 IE8 中立即导致了之前工作正常的东西出现问题。

    如果您在 CSS 文件中像这样为 BODY 元素指定背景颜色

    body {
    background: black;
    }

    如果您包含的 jQuery 版本低于 1.6.1,则在 IE8 中渲染页面时会尊重此颜色。如果您包含 1.6.1,则背景颜色将设置为白色。

    我使用最小的 HTML 文件和 1.5.2、1.6 和 1.6.1 测试了这一点。它在 1.5.2 和 1.6 中有效,但在 1.6.1 中失败。

    请修复此问题。

  6. 您好,

    我从 1.5.2 切换到 1.6.1 后,我所有的事件都停止工作,我无法使用 bond 或 live,我只能使用 $(element).click(func)

    也许您应该停止每隔一天就发布新版本,也许应该在发布 jQuery 之前先进行测试,最近出现了很多 bug。
    总是不得不回到旧版本真是太糟糕了,因为新版本无法正常工作。

    现在该收紧了,伙计们!

  7. @Nisse

    无意冒犯,但您的评论非常粗鲁。

    首先,您应该浏览 API 并了解绑定事件和实时事件之间的区别。

    其次,您应该了解 jQuery 的测试过程有多么严格。

    第三,您应该在要求 jQuery 团队收紧代码之前先收紧自己的代码。

    抱歉,我不想在这里引起争议,但是对于这个团队所做的一切,这种表达对无知的沮丧的方式非常糟糕。

  8. $(“.test”).val() 是 “”
    $(“.test”).attr(“value”) 是 undefined
    $(“.test”).prop(“value”) 是 undefined
    但是如果

    一切都很好
    如何在 div 中获取“value”?

  9. @attr

    要获取 div 的值,您可以使用

    $(“#div1”).html() 或 $(“#div1”).text()

  10. 感谢您在 1.6.1 版本中完成的修复。特别是继续支持 attr(“”) 的向后兼容性问题,并阐明了 prop(“”) 的用法。

  11. 我遇到了与“attr”相同的问题。

    如果您有 div:bar

    在 1.5.2 中,您可以使用 $(‘.test’).attr(‘value’) 获取属性“value”。
    在 1.6.1 中,您无法获取属性“value”。

  12. 我理解这个问题,但不理解这个解决方案。为什么您不添加一个 initial 函数或类似的函数来设置对象的初始属性(只有少数人需要它),并将 prop 与 attr 合并以保持向后兼容性?

  13. Wagner Silva 说:

    我非常感谢 jQuery 团队在 1.6.1 上的工作。

    这些天我一直在尝试操作一个复选框,并遇到了一些问题。

    如果我使用以下方法选中一个复选框
    $(“input[name=’ppbras'”]).attr(“checked”,true);

    $(“input[name=’ppbras'”]).attr(“checked”,”checked”);

    它在第一次运行时效果很好。但是,当用户再次点击并“取消选中”复选框时,如果我再次运行脚本,它就不起作用了。
    我还没有发现原因。

    我的解决方法是
    $(“input[name=’ppbras'”])(0).checked = true;

    这样就能完美地工作!

  14. Wagner Silva 说:

    抱歉,它可以使用以下方法工作

    $(“input[name=’ppbras'”])[0].checked = true;

    是我的错误!:)

  15. 在使用 Ajax 调用发送空数组时,有一些奇怪的事情,例如

    $.post(“/whatever”, {foo: [1,2,3], bar: []}, function(data) {…});

    使用 jQuery 1.5.2, “bar” 参数在服务器(Rails)上被识别为一个空数组,但在使用 1.6.1 时,它根本不会出现在请求参数中。
    不会出现在请求参数中。

  16. 抱歉再次发表。

    <div class="test" value="1" <</div<
    $(“.test”).val() 是 “”
    $(“.test”).attr(“value”) 是 undefined
    $(“.test”).prop(“value”) 是 undefined
    但是如果
    <input class=".test" value="1" <</input<
    或将“value”重命名为“anything”。
    一切都很好

    如何在 div 中获取“value”?

  17. 1.6.1 与 1.5.2 不兼容,我在我的网站上测试了它,它不再像预期那样工作,即使没有出现 Javascript 错误。

    由于您没有提供迁移说明,我不得不停留在 1.5.X 版本。

  18. Jay River 说:

    我并不想无礼,但我必须同意这里发表的一些评论,这些评论提到了 jQuery 最新版本中明显的质量下降。当我第一次开始使用 jQuery 时,它确实帮助我解决了跨浏览器问题,让我的生活更轻松。从 1.5+ 开始,jQuery 开始给我制造问题,而且在我看来,你们缺乏合适的回归测试方法。

    我遇到了上面 Larry 提到的关于 CSS 的相同问题。另一个真正让我开始考虑完全放弃 jQuery 的问题是出现了无限循环,而我在 1.5 之前的版本中从未遇到过。在似乎无法重现的情况下,jQuery 在 Firefox 中陷入无限循环,严重影响了用户体验。在 Google 上搜索这个主题,你会看到许多其他人明显地遇到了这种沮丧的体验。

    我建议你们 jQuery 团队花点时间思考一下最近的做法,并放慢最近开始的版本发布速度。显然,在前进的道路上,你们已经失去了对质量的重要性,而不是数量(考虑到你们仅仅在过去一年中发布了多少个版本!)。

  19. 我有一个问题…
    让它更容易下载有那么难吗?
    你们那么优秀,难道认为我们想看到你们写的每一件事吗?
    如果我想要一个该死的 .ZIP 文件,为什么要让它如此如此如此如此难以找到?难道就像你们的大脑一样是不可见的?

  20. damian_sux 说:

    滚蛋,damian。

    如果您作为开发者使用 jQuery,您应该知道您可以将它链接到您的页眉,或者右键单击,选择“另存为”将 .js 文件保存到您的硬盘驱动器或服务器。

    显然,您无法弄清楚这两个方法,所以您不属于这里。

  21. Michael Lane 说:

    我使用的是 CS4 Dreamweaver 以及 jqery-1.2.6。有没有办法用这个新版本替换旧版本,以便当我插入使用旧版本的 gadget 时,它会自动链接并包含新版本?

    我可以手动操作,但如果可能的话,我希望它在 Dreamweaver CS4 中自动执行。

  22. 我在事件方面遇到了问题,“Nisse”也发布了一些关于事件问题的帖子,有人应该摧毁这个版本。

  23. 您好
    许多 jQuery 插件,如 nivo slider、popeye、tipTip 等,在最新的 1.6.1 版本中无法正常工作(1.6 版本也一样)。