jQuery 1.6 发布

发布日期 作者

jQuery 1.6 现已发布并可供使用!我们对这个版本非常自豪,它包含了属性模块的重大重写以及一些性能改进。

请借此机会感谢 jQuery 团队jQuery Bug 分发团队 的成员,感谢他们帮助我们发布这个版本。

您可以从 jQuery CDN 获取代码

您也可以从其他 CDN 获取代码

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

事实上,我们已经开始着手进行 jQuery 1.7 的开发。我们正在欢迎 jQuery 1.7 的功能提案。如果您有任何建议,请使用上述表格提交。

jQuery 1.6 更改日志

此版本中发生的所有 API 更改都可以在 jQuery API 文档中找到
https://api.jqueryjs.cn/category/version/1.6/

重大更改

在大多数版本中,我们尝试保持与现有代码的兼容性。但是,在某些情况下,jQuery 1.6 可能需要更改现有代码

data- 属性的大小写映射

jQuery 1.5 在 .data() 方法中引入了一项功能,可以自动导入元素上设置的任何 data- 属性,并使用 JSON 语义将其转换为 JavaScript 值。在 jQuery 1.6 中,我们已更新此功能以匹配 W3C HTML5 规范,关于对包含连字符的数据属性进行驼峰式大小写转换。因此,例如在 jQuery 1.5.2 中,data-max-value="15" 的属性将创建一个数据对象 { max-value: 15 },但从 jQuery 1.6 开始,它设置为 { maxValue: 15 }

.prop().removeProp().attr()

在 1.6 版本中,我们已将 DOM 属性和 DOM 属性的处理拆分为单独的方法。新的 .prop() 方法设置或获取 DOM 元素上的属性,而 .removeProp() 删除属性。过去,jQuery 没有明确区分属性和属性。通常,DOM 属性表示从文档中检索到的 DOM 信息的状态,例如标记 <input type="text" value="abc"> 中的 value 属性。DOM 属性表示文档的动态状态;例如,如果用户在上面的输入元素中单击并键入 def,则 .prop("value")abcdef,但 .attr("value") 仍然为 abc

在大多数情况下,浏览器将属性值视为属性的起始值,但布尔属性(如 checkeddisabled)具有不寻常的语义。

例如,考虑标记 <input type="checkbox" checked>checked 属性的存在意味着 DOM .checked 属性为 true,即使属性没有值。在上面的代码中,checked 属性值为一个空字符串(如果未指定属性,则为 undefined),但 checked 属性值为 true

在 jQuery 1.6 之前,.attr("checked") 返回布尔属性值(true),但从 jQuery 1.6 开始,它返回属性的实际值(一个空字符串),这在用户单击复选框以更改其状态时不会更改。

有几种方法可以检查复选框的当前选中状态。最有效和性能最好的方法是直接使用 DOM 属性,例如在事件处理程序中使用 this.checked,其中 this 引用被单击的元素。在使用 jQuery 1.6 或更高版本的代码中,新方法 $(this).prop("checked") 检索与 this.checked 相同的值,并且速度相对较快。最后,表达式 $(this).is(":checked") 对所有版本的 jQuery 都有效。

Ajax

已修复的错误

  • #6481: 恢复 $.param 应将空数组/对象视为空字符串
  • #7881: 使其与 XHR 2 兼容
  • #8417: 在发布 AJAX 和数据具有“??”时,将其格式化为 jQuery<timestamp>?
  • #8744: .ajax() jsonp 请求在超时时未被正确处理
  • #8884: jqXHR 弄乱了自定义标题字段的名称

属性

性能改进

jQuery 1.6 .attr("value")

jQuery 1.6 .attr("name", "value")

jQuery 1.6 .val() (get)

测试和数据

.prop().removeProp().attr()

(有关更改内容的说明,请参见上面的“重大更改”部分。)

布尔属性

在 jQuery 1.6 中,布尔属性(如 selected、checked 等)现在可以通过将 truefalse 传递给 .attr() 来切换,以添加或删除它们。例如

$("#checkbox").attr("checked", true); // Checks it
$("#checkbox").attr("checked", false); // Unchecks it

.attr().val() 的可扩展性

为了更容易地为特定属性(jQuery.attrHooks)或表单输入值(jQuery.valHooks)添加特殊处理,添加了两个新的钩子。

例如

jQuery.attrHooks.selected = {
	set: function( elem, value ) {
		if ( value === false ) {
			jQuery.removeAttr(elem, “selected”);
			return value;
		}
	}
};

这两个钩子的行为与 jQuery 的内置 CSS 钩子非常相似(允许您为特定情况指定属性(或值)的获取或设置方法)。

已修复的错误

  • #1591: IE “无效参数” $(‘table’).attr(‘non-existent’)
  • #3116: .attr 不适用于 SVG IDLs
  • #3786: removeAttr 应使用 jQuery.props
  • #4283: .attr(‘checked’) & XHTML 1.1 Strict
  • #4464: IE 无法获取分离的 IMG 元素的 width 属性
  • #4978: jQuery.prop 缺少 cellpadding?
  • #5413: 标签“img”宽度/高度属性为零(IE)
  • #6562: 使用 .attr() 设置‘target’ 属性,节点的 ID 为‘target’
  • #6708: Opera 对 usemap 属性值的返回值不一致
  • #6823: 使 .val(value) 对常见用例更快
  • #7472: $(‘form’).attr(‘id’) 返回 DOM 元素
  • #7485: [attribute] 选择器和 attr() 方法之间的不一致性
  • #7709: 从非 Chrome Firefox/3.5.15 访问属性‘nodeType’ 时拒绝访问权限
  • #7996: Safari $(‘script’).attr(‘event’); 错误
  • #8117: .removeAttr 不适用于 select 元素的 size 属性
  • #8150: Webkit 和 Firefox 中的 removeAttr 问题
  • #8255: 对 list 属性的支持
  • #8418: 在 IE 7 中使用 attr() 方法设置 name 参数
  • #8457: attrHooks
  • #8570: .val 方法对 IE9 中动态创建的单选按钮返回“on”
  • #8699: .attr() 在缺少属性时返回 -1,而不是 undefined
  • #8772: 使用 .attr() 设置 input 类型‘range’ 会在 IE9 中导致脚本错误
  • #8997: 不支持新的属性“form”(HTML5),.attr(‘form’) 无法正常工作
  • #9037: $(‘blah’).attr(‘onclick’) 在 Firefox 中返回事件

构建

已修复的错误

  • #8854: minifier 进程中的错误

核心

jQuery.map( 对象 )

现在可以使用 jQuery.map 方法映射 JavaScript 对象的属性。例如

var counts = { first: 1, second: 2 };
	
counts = jQuery.map( counts, function( value ) {
	return value++;
});

已修复的错误

  • #2616: 更好的 jQuery.map
  • #4366: $.each 在 IE 中使用 document.styleSheets 时失败
  • #6690: 存储对 location 和 navigator 对象的引用
  • #7049: 使 jQuery.noConflict() 可随时调用
  • #7783: 修复 $.proxy 以与(和使用)Function.prototype.bind 一致
  • #7862: jQuery.globalEval(): Firefox 中远程脚本延迟执行
  • #7990: 在 Firefox 中使用 jQuery 构造函数创建大型 HTML 块时,脚本空间配额已用尽错误
  • #8893: jQuery.proxy( context, name ) 在 1.6b1 中存在错误
  • #8984: jQuery 无法正确解析字符串中的 html!
  • #8993: jQuery.map( emptyNodeList ) 枚举属性。

CSS

相对 CSS

我们移植了 .animate() 方法的功能,使您可以使用相对值更新 CSS 属性。您现在可以在 CSS 值前面加上“+=”或“-=”以相对于当前值相对更新属性。

// Move an item 10px over
$("#item").css("left", "+=10px");

已修复的错误

  • #6135: jQuery 尝试访问文本标签的 .style 属性
  • #7345: 支持 $().css() 的相对值
  • #7730: offset.js: setOffset 使用 parseInt 解析可能包含浮点数的 css 值
  • #8401: 对 opacity cssHooks 的小幅增强
  • #8402: jQuery.cssProps 在除 IE6/7/8 之外的所有浏览器中都是无用的
  • #8403: jQuery 在分配不透明度时会破坏其他 IE 过滤器

数据

性能改进

通过提高事件触发的性能,.data() 取得了巨大的性能改进。jQuery 的 .data() 方法触发 getData 和 setData 事件,这使得插件能够获得更高的可扩展性,改进它们触发的机制可以使 .data() 变得更快。

jQuery 1.6 .data() (get and set)

测试和数据

已修复的错误

  • #7328: data-foo-bar 是否可以通过 .data( ‘fooBar’ ) 和 .data( ‘foo-bar’ ) 访问

Deferreds

deferred.always()

在 1.5 中,如果你想在 Deferred 对象被 resolve 或 reject 时执行相同的操作,你必须使用命名函数并将其两次传递给 “then”

function callback() {
    // the deferred has been resolved or rejected
}

defer.then( callback, callback );

使用 “always”,你可以在一行内完成

defer.always(function() {
    // the deferred has been resolved or rejected
});

deferred.pipe()

链式异步任务可能很繁琐,特别是当你想为整个链返回一个 Promise 时

function chainedAjax( url ) {
    return $.Deferred(function( defer ) {
        $.ajax( url ).then( function( url2 ) {
            $.ajax( url2 ).then( defer.resolve, defer.reject )
        }, defer.reject ).promise();
    });
}

使用 “pipe”,一切变得更加可读和自然

function chainedAjax( url ) {
    return $.ajax( url ).pipe(function( url2 ) {
        return $.ajax( url2 );
    });
}

它还可以用来过滤 resolve 和/或 reject 值

var request = $.ajax( url ).pipe(function( data ) {
   return data.value;
});

request.done(function( value ) {
    // we get the value field of the original response
});

效果

同步动画

在 jQuery 中,你可以让多个动画同时运行(甚至在同一个元素上,对不同的属性进行动画)。在 1.6 中,我们引入了一个增强功能,确保所有动画同步到相同的计时器间隔。这在以前可能会造成问题,因为动画可能变得稍微不同步(甚至几毫秒),导致动画稍微“偏离”。

更平滑的动画

此外,jQuery 现在使用浏览器提供的新的 requestAnimationFrame 方法,使我们的动画更加平滑。我们可以使用此功能来避免调用计时器,而是依赖浏览器提供最佳的动画体验。

.promise()

就像之前的 $.ajax() 一样,$.animate() 现在也获得了 “Deferred” 。jQuery 对象现在可以返回一个 Promise,用来观察集合中所有动画何时完成

$(".elements").fadeOut();

$.when( $(".elements") ).done(function( elements ) {
    // all elements faded out
});

已修复的错误

  • #7917: 当 .animate() 用于大量元素时,它们不会 “同步”
  • #7934: 在 $.fn.animate 中实现 Deferreds
  • #7974: 清理 effects.js 以提高性能并减少文件大小
  • #8099: SPAN 元素在 show() 时变为块级元素
  • #8101: 使用 requestAnimationFrame 代替 setInterval 来进行动画,如果可用

事件

性能改进

(正如在讨论 .data() 性能时提到的,事件触发的性能已经得到改进。)

jQuery.holdReady()

jQuery 提供了一种机制来延迟 ready 事件的执行(主要用于插件作者)。这种机制的 API 在 1.6 中得到了改进,结果只有一个简单的方法

jQuery.holdReady( true ); // Pause execution of ready event
// later...
jQuery.holdReady( false ); // Resume execution

已修复的错误

  • #5884: 当嵌套时,实时 mouseenter/mouseleave 事件不会按预期触发
  • #6514: 如果通过 live 绑定,Mouseenter 和 mouseleave 事件无法触发
  • #6913: 命名空间事件冒泡错误
  • #6993: .bind() 和 .one() 不允许函数作为数据
  • #7071: 在 IE 上访问 VML 元素的 ‘type’ 属性会失败
  • #7883: .delegate(和 .live)应该接受 false 作为 fn 参数,就像 .bind 一样
  • #8018: 对 frameElement 的不安全访问会导致跨域 (i)frame 中的错误
  • #8272: 纯 JS 对象事件处理程序中的异常被 jQuery 吞噬
  • #8712: 自定义事件不会冒泡到窗口
  • #8732: 对 IE9 focusin/focusout 的错误功能检测
  • #8753: jQuery 1.6: jQuery.Event 构造函数支持设置属性
  • #8755: 在 IE6、7、8 中,绑定到 beforeunload 会在页面卸载时抛出错误
  • #8777: jQuery 1.6: undelegate() 接受自定义命名空间事件
  • #8788: 重组 jQuery.event.trigger 以使用循环而不是递归
  • #8790: 优化未附加的事件,例如数据事件
  • #8803: jQuery.holdReady() 方法

操作

已修复的错误

  • #1954: val() 在 IE 中为按钮元素返回 innerHTML
  • #6180: jQuery.clean 不应该触碰类型不是 text/javascript 的脚本标签
  • #7623: 在 replaceWith 中抛出异常
  • #7885: 当当前偏移量为浮点数(这在 FireFox 中是可能的)时,jQuery .offset 无法正常工作。
  • #8060: 在断开连接的复选框上将 checked 设置为 true 不会在附加到 DOM 后保留。
  • #8500: 收音机和复选框在 IE 中被包装时会恢复到默认(HTML)状态

杂项

已修复的错误

  • #8203: 删除不必要的 “someVar = null;”
  • #8851: 在源代码和测试中用双引号将字符串包装起来
  • #8882: 测试:更新 QUnit 用法,将 id=main 替换为 id=qunit-fixture

偏移

已修复的错误

  • #7931: 当在空的 jQuery 对象上调用 scrollTop 和 scrollLeft 设置器时,它们会返回 null

选择器

:focus 选择器

在 jQuery 1.6 中,我们现在确保 :focus 选择器在所有浏览器中都能正常工作。你可以使用此选择器来查找页面上当前获得焦点的元素(例如表单输入)。

$("input:focus").addClass("active");
  • #3685: 选择器对于名称为 “name” 的表单元素失败
  • #4321: $(“#”) 返回 undefined
  • #8105: :focus 选择器过滤器

支持

已修复的错误

  • #9028: 如果使用 body 背景图像,IE8 会在加载 1.6rc1 时崩溃

遍历

find()closest()is() 现在都接受 DOM 元素和 jQuery 对象

在 jQuery 1.6 中,我们确保 find()closest()is() 都可以接受 DOM 元素和 jQuery 对象作为参数。这为你提供了根据传递的元素过滤元素集的替代方法。

// Only returns .test elements if they're inside of a div
$("div").find( $(".test") )

已修复的错误

  • #2773: $.fn.is 和 $.fn.not 应该接受 DOM 元素和 jQuery 集合
  • #5712: 允许 jQuery.fn.is 接受一个函数
  • #6912: $().add(selectElement) 添加选项子元素而不是自身
  • #7369: $(‘<div>ff</div>’).closest(‘[attr]’); 在所有浏览器中引发异常
  • #8609: .find(” “) 的结果为 undefined

关于 “jQuery 1.6 发布” 的 68 条评论

  1. Alexander Trefz on 说道:

    再次感谢 jQuery 团队和 Triage 团队的出色工作。期待使用 1.6,也期待看到 1.7 的 Beta 版本。

    如果 PubSub 能成为 jQuery 核心而不是插件,我会非常感谢,因为只有这样人们才会更频繁地使用它。

  2. alexander farkas on 说道:

    $.attr(input, ‘checked’)
    返回一个空字符串,而不是 undefined。

    此外,checked 内容属性和 IDL 属性会反映出来,也就是说,如果 $.attr(input, ‘checked’) 为 undefined,那么 $.prop(input, ‘checked’) 将为 false,反之亦然。

  3. 我之前读过,微软的 Templating 插件将在 1.5 版本中被整合到核心代码中……但我在这里 1.6 中仍然没有看到它……。

    这是被搁置/延迟了吗?

  4. Luke Coleman 说:

    我非常感谢关于重大更改的部分。 作为一个在不愿意包含新库的公司工作的开发者,当你包含这样的文本时,推出新版本会容易得多。

    谢谢!

  5. 恭喜! 这些新功能非常有用,性能的改进将有助于创建更好、更复杂的东西,加上 requestAnimation 动画在现代浏览器上将会有所改善。

  6. Helder Satin 说:

    非常感谢您使用 jQuery 让我的生活更美好 :) 你们简直太棒了!

  7. 当一个人得知原本已经很惊人的东西现在变得更惊人时,这提醒我们那些巨大的轮子在转动。 谢谢大家。

  8. Alexander Hartmaier 说:

    感谢您修复了 bug #8418!
    几个月前我花了整整两天时间来解决它。

  9. 嗯。 你们完全改变了 .attr(‘checked’) 的工作方式? 你们意识到如果人们升级到 jQuery 1.6,会有多少代码会被破坏吗?

  10. 哦,天哪。 不要改变我们能够轻松控制的代码。 想想所有使用 attr() 的插件,现在它们将无法工作。 不要误会我的意思,我喜欢这些更新,但这次更新让我非常担心。

  11. 太棒了! jQuery 中体现出的工作量和独创性让我惊叹不已。 确实,当我使用 jQuery 时,我感到“站在巨人的肩膀上”。 谢谢!

    Korak

  12. Tobias 说:

    使用

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

    不一致,如果我实际上必须使用

    $(“#checkbox”).prop(“checked”);

    来获取复选框的当前状态?

  13. 整个 .attr(“disabled”, “disabled”) 到 .attr(“disabled”, true) 的更改让我困惑了一段时间,但现在好多了,更有意义。 太棒了!

  14. 太棒了! 感谢所有好的更新,但更改以前方法的功能/使用将是我们所有人的一大问题。

  15. 请把我加入到对你们对 .attr() 的更改感到担忧的用户列表中。如果这种兼容性上的中断确实必要,那么我想看到一些关于为什么进行更改的明确说明。

  16. 在上面的“性能改进”部分中,第一个图表不应该标为“.attr(“name”)”而不是“.attr(“value”)”吗?

  17. 总体来说,很棒。

    我担心自己对 attr/prop 更改的理解还不够透彻。是否保持 attr 具有旧的 prop 含义,并为原始 html 属性引入一个新的函数名称,这样更一致且向后兼容?

    那么,我还想知道上面使用 attr() 而不是 prop() 的示例,或者我是否误解了?

    你们写道。

    > 布尔属性
    >
    > 在 jQuery 1.6 中,布尔属性(如 selected、checked 等)现在可以通过将 true 或 false 传递给 .attr() 来切换,以添加或删除它们。例如
    >
    > $(“#checkbox”).attr(“checked”,true);// 选中它
    > $(“#checkbox”).attr(“checked”,false);// 取消选中它

    应该写成 .attr 吗?这是否意味着 .attr 仍然可以更改(并且它会更改 .prop(),但 .attr() 不会反映 html 代码)?

    这里真的需要一篇澄清文章,因为我肯定误解了。我相信 jQuery 团队不会破坏 jQuery 得这么厉害…

    在 CMS 中,多个模块依赖于 jQuery,加载最新版本通常可以正常运行。看起来 1.6 不行。

    非常感谢你们的澄清。:)

    并继续努力!

  18. 我从未遇到过 jQuery 的任何版本像这次一样,在我的应用中破坏了那么多东西。这真是令人惊讶。我认为大多数错误与 .attr()/.prop() 的更改有关,但我也看到 .offset() 在以前从未出现过的情况下返回 null,以及其他一些问题。我将花费几天甚至几周的时间来让所有东西在 jQuery 1.6 中重新正常运行。这是我不想遇到的麻烦。

  19. Charlie Elgholm 说:

    很高兴看到性能改进,只是很遗憾有 attr/prop 的更改;1.6 对我们来说已经变得无用了。

    如果有人能把其他改进都放到 1.5.99 中,我会很感激(我相信其他人也是)。

  20. 1.6 中出现了一些问题,我暂时回到了 1.5。我在“第 16 行,第 11777 列”处遇到错误,但还无法确定原因。很可能是我的脚本中的一些编码错误,在 1.6 中的一些更改现在暴露了出来,但它目前只在 IE 8/PC 中出现。在 Safari/Mac 和 Firefox/Mac 中运行良好(尚未测试 Ff/PC)。

    代码如下

    function editFlow( theJob, theID ) {
    $.get( 'terminform.ajax.php?jobuid=' + theJob + '&terminuid=' + theID,
    function( data ) {
    $( '#flow-' + theID ).html( data );
    $( '.flow-edit-container' ).fadeOut('fast' );
    $( '#flow-' + theID ).fadeIn( 'fast' );
    }
    );
    }

    欢迎提出建议,尽管这可能不是寻找解决方案的正确地方 :)

  21. 评论

    jquery-1.4.4.min.js:82 kio
    jquery-1.5.2.min.js:86 kio
    jquery-1.6.min.js:94 kio

    文件大小越来越大,什么时候会停止?
    (la taille du fichier est de plus en plus importante quand cela va-t-il s’arrêter ?)
    感谢你们的付出

  22. 感谢你们的辛勤付出,我在最近的项目中广泛使用了 JQuery,该项目展示了由 comet 引擎驱动的实时数据。这样做,我不得不编写数百行代码来实现以最佳性能更新数据,那时我想,JQuery 团队是如何创建这样一个具有最佳性能的伟大库的。现在,你们又提供了性能更好的增强版本…

    你们是最棒的,你们重新定义了网络!:)