jQuery 1.6.3 RC1 发布

发布日期: 作者:

jQuery 1.6.3 即将发布!我们需要您的帮助来测试这个候选版本,以确保一切正常。

您可以通过包含以下两个文件中的任意一个来进行测试(一个压缩,一个未压缩)。我们首选的测试用例场所是 jsFiddle;您只需在那里使用“jQuery(边缘)”选项即可。如果您需要报告错误,但无法使用 jsFiddle,请使用未压缩版本和您的测试用例。

请使用您最珍贵的代码测试此版本。如果您发现与 1.6.2 存在任何重大差异,请尽快 提交错误报告,并务必提及您正在针对 jQuery 1.6.3 RC1 进行测试。

如果您从一个非常旧版本的 jQuery 版本跃升到最新版本,您发现的差异可能是由于主要版本发布中记录的行为变更造成的。请先使用已发布的 1.6.2 版本检查您的代码,以确保问题只存在于 1.6.3 RC1 中。

亮点

修复了一个 XSS 攻击向量:用户 ma.la 报告了一个常见模式,许多网站使用它通过 location.hash 选择元素,从而允许攻击者将脚本注入页面。这种做法似乎相当普遍,因此我们决定修改选择器识别,以防止在最常见情况下出现脚本注入。如果传递给 $() 的任何字符串在 HTML 标签(以及脚本)之前包含“#”字符,则该字符串不能包含 HTML 标签。

不再出现动画 “漏洞”当我们在版本 1.6 中添加对浏览器的 requestAnimationFrame API 的支持时,我们对此抱有很高的期望。然而,从那时起,我们收到的最多的投诉之一是与 requestAnimationFrame 在选项卡不可见时表现出的方式有关。所有在选项卡不可见时启动的动画都会“堆叠”起来,直到选项卡重新获得焦点后才执行。然后,它们会以超高速动画!我们已经移除了对该 API 的支持(这对您调用 jQuery 的动画功能的方式没有影响),并计划将其纳入 jQuery 的未来版本中。

改进对 HTML5 数据属性名称的处理:$().data() API 既可以处理 jQuery 和插件的内部使用数据,也可以读取 HTML5 data- 属性的初始值。我们已经改进了使用 HTML5 约定的能力,例如在需要时将 camel-case 转换为 camelCase。但是请记住,$().data() API 只会在初始时读取 HTML5 data- 属性,出于性能原因,不会将后续数据更改与属性同步。要更新 HTML 标记中的实际属性,请使用 .attr()

jQuery 1.6.3 更改日志

当前 1.6.3 版本的更改日志

Ajax

  • #9255:jQuery.parseXML 错误处理在 WebKit 浏览器中不起作用
  • #9854:传递 statusText 而不是“规范化”它
  • #9887:jQuery.ajaxSetup 可能会导致不必要的内存使用
  • #9970:ajax.js 中的错别字:status 应该是 jqXHR.status?
  • #10098:对类似于注释的 Accept 标头进行编码,以避免移动运营商对其进行篡改

属性

  • #9630:foo.contents().hasClass() 返回不正确的值
  • #9699:removeAttr(‘style’) 在 WebKit 中不一致地删除 style 属性
  • #9719:removeAttr(‘disabled’) 不会更改 IE6 中输入的颜色
  • #9979:.prop(‘tabIndex’) 对尚未设置 tabIndex 的元素返回不一致的结果
  • #9980:通过在 IE6/7 中对所有内容使用 getAttributeNode 来简化 attr 代码

构建

  • #9988:压缩版 jQuery 中的最小许可证标头

核心

  • #9521:使用 $(location.hash) 和 $(#) 时出现 XSS
  • #9897:尝试捕获 isPlainObject 检测
  • #10076:如果第二个参数为 `null` 或 `undefined`,则 $.inArray 会导致 IE6 和 Chrome 崩溃

CSS

  • #6652:动画结束后删除 filter:alpha(opacity=100)
  • #9572:在 .css() 方法中支持 -ms-transform
  • #10021:无法使用相对值语法将负数添加到 .css() 和 .animate() 中

数据

  • #8235:jQuery.data 在某些情况下会抛出脚本错误
  • #9318:如果属性名称包含数字,则 HTML5 数据属性具有奇怪的行为
  • #9413:$.fn.removeData 不会删除名称中带有破折号的数据
  • #9779:允许对数据属性值进行非 null|undefined 评估
  • #9794:jQuery.fn.data() 正确处理对任意数据属性值的访问
  • #10016:无法使用 jQuery.data 方法检索带有破折号的键名的“假值”
  • #10080:从框架的窗口卸载在 IE8 中中断

尺寸

  • #10123:.width() 在 Firefox 6 中可能返回浮点数

效果

  • #9381:由于 requestAnimationFrame,浏览器失去焦点时动画会停止
  • #9678:动画清除 setInterval

事件

  • #7071:在 IE 中,在提交特殊处理程序期间访问 VML 元素上的“type”属性失败

操作

  • #9587:使用对象克隆 div 会导致 IE8 错误

支持

  • #9634:在 support.js 初始化期间,左上角出现可见的“t”字符
  • #9823:在 IE 8 中,在 css 中对 BODY 使用 background-image 会导致崩溃
  • #9964:test/support.js 模块 strictEqual 错别字
  • #10029:$.support.scriptEval 已删除,但仍包含在文档中

如果您发现问题,请尽快提交错误报告和测试用例,如上所述。博客评论或 Twitter 并非有帮助的错误报告!

关于“jQuery 1.6.3 RC1 发布”的 7 个想法

  1. Manuel Ricci 说:

    我已经用我的作品测试了这个版本,一切正常。但是,在这个简单的脚本中

    $(‘document’).ready(function(){
    $(‘.ani’).animate({padding: ’20px’, borderBottom: ‘3px solid #8f8f8f’,borderRight: ‘3px solid #bfbfbf’},2000);
    });

    该类只用 padding 动画,边框没有出现。

  2. 我在 Chrome 的一个图片轮播中遇到了那个漏洞。在你离开后,它变得完全疯狂,然后在你返回到你的选项卡后,我无法弄清楚是什么导致了它!

    我甚至添加了一些代码,在窗口失去焦点时暂停轮播,并在获得焦点后恢复。我很高兴读到这篇文章,所以我可以删除这段代码 :)

  3. Salman Abbas 说:

    @Blaise 即使 jQuery.animate 的文档页面明确提到:-
    “由于 requestAnimationFrame() 的性质,您永远不应该使用 setInterval 或 setTimeout 循环来排队动画。为了保留 CPU 资源,支持 requestAnimationFrame 的浏览器在窗口/选项卡未显示时不会更新动画。如果您在动画暂停时继续通过 setInterval 或 setTimeout 来排队动画,所有排队的动画都将在窗口/选项卡重新获得焦点时开始播放。为了避免此潜在问题,请在循环中使用最后一个动画的回调,或将函数附加到元素的 .queue(),以设置开始下一个动画的超时。”

    由于一些新手,删除了这样一个出色的功能。太可惜了 :(

  4. Ron Otten 说:

    同意 Salman 的观点。

    不应该因为初级开发者误用该功能而删除它。最好是设置一个可选的开关。这样一来,所有依靠不完善的图片轮播等功能的开发人员都可以继续使用该功能,而更了解的开发者则可以切换开关并使用更好的 API(如果可用)来实现更流畅的动画,更少的资源消耗等。

    那么……将 requestAnimationFrame 行为强制回退到 1.6.3 作为“插件”的可行性如何?

  5. shawn 说:

    是否可以利用页面可见性 API 在 jQuery.animate 中检查 document.hidden,从而避免 requestAnimationFrame 问题?

  6. @Salman Abbas “即使 jQuery.animate 的文档页面明确提到:”

    当我使用新版 jQuery 时,我不会再阅读文档。

    我确实会在新版 jQuery 发布时阅读博文,查看有哪些变化以及是否会影响我。requestAnimationFrame 在发布时谈到更流畅的动画。我当时想“很好,不错,谢谢”。博文应该附带一个重要的警告,但我想开发人员当时并没有预见到这个问题。

    当然,queue() 本应该是 jQuery 中用于排队动画的方式,这样可以防止问题发生,但每个人使用 jQuery 的方式和目的都不一样,我们不应该妄加猜测。setInterval 是一个完全可以用来实现间隔的办法。只是不能和 requestAnimationFrame 一起使用。