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

发布于 作者

我们很高兴地宣布 jQuery 的最新版本:jQuery 1.1.4。如果没有任何严重错误,这个版本将是 1.1.x 分支的最后一个版本 - 引导我们进入 9 月份发布的 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 之间遇到任何错误,请告知我们。谢谢!

关于“jQuery 1.1.4:更快,更多测试,为 1.2 做好准备”的 71 个想法

  1. 在 IE7 中

    $.ajax({ url:”test.html”,
    ifModified: true,
    success: function(msg){
    $(“#output1”).html(msg);
    }
    });
    —-> 由于错误 8002001,无法完成操作
    当我将 $(“#output1”).html(msg); 更改为 $(“#output1”).text(msg); 时,它可以正常工作,但有很多 html 标签 ………..

    那么 1.1.4.1 的 .html 有问题吗?

  2. Daniel Lin:使用 fiddler 我可以看到响应,它没问题
    但 div 中没有显示任何内容。实际上,它清空了 div

  3. 我对所提到的速度改进感到惊讶。我真的很期待测试新版本。应该在今晚启动并运行。

    我刚开始使用 jQuery,我爱上了它的易用性和易于理解,我已经编写了 10 年的 PHP 代码,以及在需要时编写各种 javascript / DOM 代码。对于初学者或专家程序员来说,jQuery 似乎是设置和实现功能的最简单的库……
    继续努力,我会继续学习,并弄清楚如何将 jQuery 库推向极限。:D

  4. 新版本快得多。显而易见。虽然我在 IE7 中发现了一个错误。在 FF 中运行良好。
    在 ajax 调用后返回 html 时

    function af_matter(mid)
    {
    var dt = $(“#mform”).formSerialize;
    $.ajax({type: “GET”,
    url: “ajax/homeAjax.php”,
    data: dt+”&mid=”+mid,
    success: function(z){$(“#mymatt”).html(z);} });}
    }

    它返回 html,然后将返回数据中的最后一个字符附加到 html 中(它是一个自动完成表单,因此返回的最后一个单词的最后一个字符附加到 html 的末尾)。不明白为什么。以下是返回的内容

    (PHP 代码片段)

    有一个 while 循环构建它,然后将其回显出来。

    $row[1]
    $row[2]

    因此,如果 $row[2] 是 “Johnson”。它将返回整个列表,并在其下方附加 “n” 来自 “johnson”。
    抱歉在这里发布它。我尝试在错误部分发布它,但我无法注册或登录。
    使用 ajaxform 插件和 masked input 插件。我已经删除了这两个插件以查看它们是否导致任何错误,但问题仍然存在。
    这在 1.1.3 中运行良好。还有其他人见过这个吗?

  5. AjaxDev0008 说:

    @frankysanders
    @John Resig
    主题 .Ajax/evalScripts() 问题

    我们追踪了问题,以及 frankysanders 上面评论背后的含义。要由 $.Ajax 加载的页面中的 script 标签不能是 IE 中任何 html 对象(div、span 等)的子元素。在 FF 中这不是问题,script 标签可以放在任何地方。除了这种不一致之外,发布一直很棒。

    这将在下一个版本中解决吗?

  6. Halmat Ferello 说:

    这段代码现在在 IE7 上失败

    $(‘a.bold-chat’).each(function(index) {
    this.href = this.href + ‘&url=’ + escape(document.location.href);
    });

  7. jQuery 1.1.4 测试甚至没有运行……

    http://EddieMaddox.com/jQuery/ …1.1.4…/test/
    “Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.6)
    Gecko/20070802 SeaMonkey/1.1.4
    测试在 7 毫秒内完成。
    0 个测试中的 0 个失败。”

    “0 个中的 0 个” 不应该大于零吗?

    谢谢,
    Eddie

  8. frankysanders 说:

    我仍然在 jquery 和 evalScripts 中遇到问题。我知道 evalScripts 已被弃用,但调用 .html 对 jquery 对象似乎没有按预期工作。基本上有两种情况用于解析 javascript。

    1)内联 alert(“hello”);
    2)和外部 src =

    我注意到 evalScripts 曾经查找这两种情况并相应地处理它们。

    evalScripts:function() {
    return this.find(“script”).each(function(){
    if ( this.src )
    jQuery.getScript( this.src );
    else
    jQuery.globalEval( this.text || this.textContent || this.innerHTML || “” );
    }).end();
    }
    jquery 的新版本声称不再需要 evalScripts,但这似乎只适用于 Firefox。

    为什么不将 evalScripts 方法与从 ajax 调用呈现 HTML 的方法结合起来?即,在调用 innerHTML 后对元素调用 evalScript。为了解决这个错误,我已经将我的应用程序从

    $(“#myId”).html(result);

    更改为

    document.getElementById(id).innerHTML = result;
    $(“#myId”).evalScripts();

    并恢复到 jquery 1.1.2。

    有谁对这个问题有任何看法或任何计划在下一个版本中修复这个问题吗?

  9. frankysanders 说:

    @John Resig

    我已经确认 IE 和 1.1.4 在将 script 标签放在 DOM 元素内部时存在问题。具体来说,jquery 在呈现 ajax 结果时不会在 ie 中解析这些标签。是否有可能很快修复它?或者我应该咬咬牙,将所有 script 标签移到 DOM 元素之外?(很痛苦的工作,但可能是必要的)

  10. Pingback:John Resig - 不间断的 jQuery

  11. Pingback:John Resig - 我今天从 jQuery 中学到了一些东西