jQuery 1.1.4:更快、更多测试,为 1.2 做准备

发布于 作者

我们很高兴地宣布 jQuery 的最新版本:jQuery 1.1.4。 除非出现严重错误,此版本将是 1.1.x 分支的最后一个版本——为九月份发布的 jQuery 1.2 铺平道路。

您可以从 jQuery Google Code 页面下载此版本

下载

改进

除了所有正常的 错误修复之外,许多改进都包含在这个版本中。

任意名称 jQuery

jQuery 在成为第一个完全能够重命名的主要 JavaScript 库方面迈出了重要一步。 以前,提供了重命名常用 ‘$’ 作为 ‘jQuery’ 的快捷方式的功能——但现在您还可以重命名 ‘$’ 和 ‘jQuery’。 这带来了两个极好的结果

  • 您现在可以在同一页面上同时包含多个版本的 jQuery。
  • 您现在可以将 jQuery 嵌入到其他对象和库的命名空间中,例如
    // With the Dojo Toolkit
    dojo.jquery = jQuery.noConflict(true);
    dojo.jquery("#elem div").slideDown("slow");
    // or with Yahoo UI
    YAHOO.query = jQuery.noConflict(true);
    YAHOO.query("span.hidden").removeClass("hidden");

速度改进

如果没有一些速度改进,版本发布还有什么意义呢? 我们借此机会超越了之前发布的所有速度测试套件,并提高了 jQuery 三个最常用的部分的速度:ID 选择器、标签名选择器和 each() 循环。 确保这些项目中的每一个都尽可能快至关重要,因为它们有可能被无休止地、重复地重用。

这是用于分析这三个更改速度的 测试套件

$(“#id”) 改进

浏览器 jQuery 1.1.3 jQuery 1.1.4 % 提升
IE 6 651ms 70ms 830%
Firefox 2 1355ms 27ms 4919%
Safari 3 101ms 14ms 620%
Opera 9 270ms 62ms 335%
平均提升 1676%

$(“elem”) 改进

浏览器 jQuery 1.1.3 jQuery 1.1.4 % 提升
IE 6 661ms 451ms 47%
Firefox 2 1717ms 143ms 1100%
Safari 3 99ms 83ms 19%
Opera 9 226ms 198ms 14%
平均提升 295%

.each() 改进

浏览器 jQuery 1.1.3 jQuery 1.1.4 % 提升
IE 6 200ms 30ms 567%
Firefox 2 468ms 29ms 1514%
Safari 3 17ms 11ms 54%
Opera 9 45ms 25ms 80%
平均提升 554%

测试套件大修

这是非常重要的消息——对于大多数开发人员来说,尤其如此。 jQuery 测试套件 已从头开始完全重新设计和改进,以提高稳定性。 已经集成了全新的动画和 Ajax 测试,使 jQuery 的总测试数量达到超过 800 个测试

此外,测试套件 在所有我们支持的主要浏览器中均能完全通过,没有任何错误:Firefox 2、Safari 3、Internet Explorer 6 和 Opera 9(为简洁起见,未显示 Safari 2 和 IE 7)。 证明

未来,我们正在努力改进 jQuery 的事件、属性和 CSS 部分的覆盖范围——无疑很快将使测试数量超过 1000 个。

此外,应该注意的是,jQuery 测试套件现在嵌入在 Mozilla 测试套件中——针对即将发布的 Firefox 3 版本的每次提交进行运行。 您可以放心,在最新版本的 Firefox 中,一切都会像您期望的那样正常工作。

错误修复

已关闭 53 个工单 用于此版本。 您可以在 错误跟踪器 上阅读完整详细信息(这包括进入 jQuery 1.1.3.1 的修复)。

解决了一系列重大问题,包括与 HTML 脚本评估、Safari CSS 计算样式访问和 Ajax 设置操作相关的问题。

新功能

引入了几个新功能。 其中前两个,.slice() 和 :has(),将是 jQuery 1.2 的一部分,但它们的存在受到一些已弃用功能的约束(请参阅下文)。 对 extend() 和 noConflict() 的新更改是为了能够修复 jQuery 中一些长期存在的错误。

.slice()

如果您认识这个方法名,那么您会很高兴,因为它与 JavaScript 数组中存在的 .slice() 方法的行为完全相同。 这是将 jQuery 对象切分并获取其内部元素的好方法。 以下所有都是使用 slice() 方法的有效方法

$("div").slice(0,1); // First div
$("div").slice(-1); // Last div
$("div").slice(1,-1); // All divs but the first and last
$("div").slice(1,3); // The second and third div
$("div").slice(7,8); // The eighth div

:has()

这个新的选择器是当前检查另一个元素内部元素的方法的替代方法(div[p])。 您现在可以使用这个选择器,就像使用那个特定的 XPath 选择器一样,如下所示

// All divs with a paragraph inside
$("div:has(p)")
// All anchors with an image inside
$("a:has(img)") 
// All divs that have an anchor inside that have an image inside
$("div:has(a:has(img))")

深度、递归.extend()

这是 jQuery .extend() 方法中经常被要求添加的功能。 此更改允许您深度合并嵌套对象(而不是让它们相互覆盖)。 最好通过一个示例来演示

// Normal .extend()
jQuery.extend(
  { name: "John", location: { city: "Boston" } },
  { last: "Resig", location: { state: "MA" } }
);
// Result:
// => { name: "John", last: "Resig", location: { state: "MA" } }
// New Deep .extend()
jQuery.extend( true,
  { name: "John", location: { city: "Boston" } },
  { last: "Resig", location: { state: "MA" } }
);
// Result:
// => { name: "John", last: "Resig",
//      location: { city: "Boston", state: "MA" } }

.noConflict(true)

如前所述,对 .noConflict() 的此添加允许您完全重命名 ‘jQuery’ 命名空间和 ‘$’ 快捷方式,同时撤消这些介绍可能带来的任何更改。 您可以使用这个新的快捷方式,如下所示

// Give jQuery a custom name:
var jq = jQuery.noConflict(true);
jq("#id div").hide();

// Both Fail - $ and jQuery have been renamed:
$("#id div").hide();
jQuery("#id div").hide();

这个技巧也可以用来将 jQuery 推入现有的命名空间,如下所示

// Put jQuery in a namespace:
var obj = {};
obj.jq = jQuery.noConflict(true);
obj.jq("#id div").hide();

已弃用的功能

我们正在弃用 jQuery 1.1.4 中的许多方法,为即将发布的 jQuery 1.2 中的 API 更改做准备。 只要可能,我们都提供了执行操作的替代方法。

使用 jQuery 1.2 时,与 jQuery 1.1 版本一样,将提供一个向后兼容性插件。 因此,如果您希望继续使用这些特定技术,您可以使用该插件并继续使用。

此外,为了处理 XPath 更改,将发布另一个单独的插件,该插件将处理 jQuery 中的 XPath 选择器功能。 该插件将与 jQuery 1.2 版本一起发布。

选择器

$("div//p") XPath 后代选择器
请使用 CSS$("div p")选择器代替。 或者,当 jQuery 1.2 发布时,使用新的 XPath 插件。

$("div/p") XPath 子选择器
请使用 CSS$("div > p")选择器代替。 或者,当 jQuery 1.2 发布时,使用新的 XPath 插件。

$("p/../div") XPath 父选择器
请使用$("p").parent("div")选择器代替。 或者,当 jQuery 1.2 发布时,使用新的 XPath 插件。

$("div[p]") XPath 包含谓词选择器
请使用新的$("div:has(p)")选择器代替。 或者,当 jQuery 1.2 发布时,使用新的 XPath 插件。

$("a[@href]") XPath 属性选择器
注意: 虽然此选择器在此版本中被弃用,但它不会在 jQuery 1.2 中删除。 在 jQuery 1.2 出现时,建议您使用 CSS 选择器$("a[href]")代替。 或者,当 jQuery 1.2 发布时,使用新的 XPath 插件。

DOM 操作

$("div").clone(false)
使用参数调用 clone 方法正在被弃用(clone 方法本身会被保留)。 不要调用.clone(false)您现在应该执行.clone().empty()代替。

DOM 遍历

$("div").eq(0)
此方法正在被弃用,以支持新的 .slice() 方法(其行为与数组的 slice() 方法完全相同。 您可以像这样复制 .eq()

$("div").slice(0,1);

此外,.eq(0) 可以像这样复制

$("div:eq(0)")
$("div:first")

$("div").lt(2)
此方法正在被弃用,以支持新的 .slice() 方法(其行为与数组的 slice() 方法完全相同。 您可以像这样复制 .lt()

$("div").slice(0,2);

此外,.lt(2) 可以像这样复制

$("div:lt(2)")

$("div").gt(2)
此方法正在被弃用,以支持新的 .slice() 方法(其行为与数组的 slice() 方法完全相同。 您可以像这样复制 .gt()

$("div").slice(3);

此外,.gt(2) 可以像这样复制

$("div:gt(2)")

Ajax

$("#elem").loadIfModified("some.php")
此便捷方法正在被删除,以支持使用更明确的 $.ajax() 的长格式

$.ajax({
  url: "some.php",
  ifModified: true,
  success: function(html){
    $("#elem").html(html);
  }
});

$.getIfModified("some.php")
此便捷方法正在被删除,以支持使用更明确的 $.ajax() 的长格式

$.ajax({
  url: "some.php",
  ifModified: true
});

$.ajaxTimeout(3000)
此便捷方法正在被删除,以支持使用更明确的 $.ajaxSetup() 的长格式

$.ajaxSetup({timeout: 3000});

$(...).evalScripts()
此方法在 jQuery 中不再必要——所有包含在 HTML 字符串中的脚本都会在注入到文档中时自动评估。 不需要替代方法。


与往常一样,如果您在 jQuery 1.1.3.1 和 jQuery 1.1.4 之间遇到任何错误,请告知我们。 谢谢!