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 | 651 毫秒 | 70 毫秒 | 830% |
Firefox 2 | 1355 毫秒 | 27 毫秒 | 4919% |
Safari 3 | 101 毫秒 | 14 毫秒 | 620% |
Opera 9 | 270 毫秒 | 62 毫秒 | 335% |
平均改进 | 1676% |
$(“elem”) 改进
浏览器 | jQuery 1.1.3 | jQuery 1.1.4 | 改进百分比 |
---|---|---|---|
IE 6 | 661 毫秒 | 451 毫秒 | 47% |
Firefox 2 | 1717 毫秒 | 143 毫秒 | 1100% |
Safari 3 | 99 毫秒 | 83 毫秒 | 19% |
Opera 9 | 226 毫秒 | 198 毫秒 | 14% |
平均改进 | 295% |
.each() 改进
浏览器 | jQuery 1.1.3 | jQuery 1.1.4 | 改进百分比 |
---|---|---|---|
IE 6 | 200 毫秒 | 30 毫秒 | 567% |
Firefox 2 | 468 毫秒 | 29 毫秒 | 1514% |
Safari 3 | 17 毫秒 | 11 毫秒 | 54% |
Opera 9 | 45 毫秒 | 25 毫秒 | 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.1 版本一样,jQuery 1.2 将提供一个向后兼容插件。因此,如果您希望继续使用这些特定技术,您将能够使用该插件并继续使用它们。
此外,为了处理 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 之间遇到任何错误,请告知我们。谢谢!
我已经在 http://www.aspstat.com/75 翻译了这份文档成中文。
在 IE7 中
$.ajax({ url:”test.html”,
ifModified: true,
success: function(msg){
$(“#output1”).html(msg);
}
});
—-> 错误原因是 $(“#output1”).html(msg); : 由于错误 8002001 无法完成操作
当我将 $(“#output1”).html(msg); 更改为 $(“#output1”).text(msg); 时,它可以工作,但有很多 html 标签 ………..
那么 1.1.4.1 的 .html 是否存在问题?
Re:Ndy
尝试使用 IE 中的 Fiddler 或 Firefox 中的 FireBUG 来跟踪服务器响应是否正确。
感谢更新。.. 您知道 jQuery UI 什么时候发布吗?只是好奇。
Rob: 根据 http://docs.jquery.com/UI/Roadmap,发布日期为 9 月 3 日。
Daniel Lin: 我可以用 fiddler 查看响应,并且它看起来正常。
但是 div 中没有显示任何内容。实际上,它清空了 div。
我对提到的速度改进感到惊讶。我真的很期待测试新版本。应该在今晚运行起来。
我刚开始使用 jQuery,我爱上了它的易用性和易理解性,我已经编写了 10 年的 PHP 代码,并且在需要时编写了各种 javascript/DOM 代码。对于初学者和专家程序员来说,jQuery 似乎是最简单的库来设置和实现功能。
继续努力,我会继续学习,并找出如何将 jQuery 库推向极限。:D
新版本快多了。非常明显。虽然我在 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 的末尾)。不明白为什么。以下是返回的内容
(PHP 代码片段)
有一个 while 循环构建它,然后将其回显。
$row[1]
$row[2]
所以如果 $row[2] 是“Johnson”,它将返回整个列表 + “n” 在“Johnson”下面。
抱歉在這裡發文。我試圖將它發佈到錯誤部分,但我無法註冊或登錄。
使用 ajaxform 插件和 masked input 插件。已删除两者以查看它们是否会导致任何错误,问题仍然存在。
这在 1.1.3 中运行良好。其他人遇到过这个问题吗?
@Robin
谢谢.. 之前没看到他们更改了日期。
@frankysanders
@John Resig
主题 .Ajax/evalScripts() 问题
我们追踪了问题以及 frankysanders 上面评论背后的含义。在 IE 中,要由 $.Ajax 加载的页面中的 script 标签不能是任何 html 对象(div、span 等)的子元素。在 FF 中这不是问题,script 标签可以位于任何位置。除了这种不一致之外,发布一直很顺利。
这将在下一个版本中解决吗?
这段代码现在在 IE7 上失败了
$(‘a.bold-chat’).each(function(index) {
this.href = this.href + ‘&url=’ + escape(document.location.href);
});
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
Firefox,相同的情况。
http://EddieMaddox.com/jQuery/jquery-1.1.4-release%20Folder/test/
“jQuery 测试套件
Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.8.1.6)
Gecko/20070725 Firefox/2.0.0.6
测试完成于 25 毫秒内。
0 个测试中的 0 个失败。”
Eddie
@Eddie: 您需要包含 src 目录以及测试目录,否则不会运行任何测试。
@AjaxDev0008: 有趣,我会检查一下,看看我是否可以确认它 - 感谢您追踪这个问题。
我仍然在 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。
是否有人对此有任何见解或在下一个版本中修复它的计划?
我无法在 1.1.4 下使用 interface.js 中的 jQuery.iDrag 插件,但在 1.1.3 下运行良好。
最好的框架有了新版本!干得好!
@John Resig
我已经确认 IE 和 1.1.4 在将脚本标签放在 DOM 元素内部时存在问题。具体来说,在渲染 AJAX 结果时,jQuery 在 IE 中无法解析这些标签。这种问题是否很快就会得到修复?或者我应该硬着头皮将所有脚本标签都移到 DOM 元素之外?(虽然工作量很大,但也许是必要的)
Pingback: John Resig - Non-Stop jQuery
Pingback: John Resig - 我今天学到了一些关于 jQuery 的东西