jQuery 1.4正式发布:一起来看有哪些新变化

为庆祝jQuery的四周年生日,jQuery官方团队正式发布了jQuery的1.4版本。在这个版本中,jQuery官方团队做了大量的编码、测试和文档工作,相对之前版本自然改进不少,让我们一起来看看有那些新变化吧。

本文分上下两篇,上篇主要总体介绍jQuery 1.4版本的相关使用及更新,下篇通过一些代码示例来展示更新的方法及新添加的方法。

【下载及调用】

像以往一样,官方提供了jQuery的两份拷贝,一份是压缩版本(使用Google Closure Compiler压缩,之前使用的是YUI),另一份是未压缩版本(用来调试和阅读)。

本博之前曾提议过通过google服务器加载jQuery,提高加载速度。现在,我们依然可以通过Google的服务器调用压缩后的jQuery 1.4版本文件,如下:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript"><!--mce:0--></script>

【新特性及变化】

在jQuery 1.4中,许多常用的jQuery方法被重写,这些改进不仅更易用,也带来了性能的显著提升。

:以下为概述,不详之处参见下篇的代码解释。

  1. 为一些方法添加设置函数(Setter Functions)

    在之前版本中,我们可以给attr()方法传入一个函数,将函数的返回值赋予某个属性。1.4中,这个功能被添加到了更多的方法中:.css()、 .attr()、 .val()、 .html()、 .text()、 .append()、.prepend()、 .before()、 .after()、.replaceWith(), .wrap()、 .wrapInner()、 .offset()、 .addClass()、 .removeClass()、 .toggleClass()。

    此外,在下面方法中,还可以传入当前值作为设置函数的第二个参数,供设置函数使用:.css()、.attr()、.val()、.html()、.text()、.append()、.prepend()、.offset()、.addClass()、.removeClass()、和 .toggleClass()。例如:

    jQuery('<img src="enter.png" alt="enter your name" />')
    .attr("alt", function(index, value) {
        return "Please, " + value;
    });
  2. 更新了jQuery中序列化的核心方法jQuery.param()

    之前对于{foo: ["bar", "baz"]}序列化后的结果是“foo=bar&foo=baz”,现在为“foo[]=bar&foo[]=baz”。
    这样更改的目的主要是告诉接收端,传入的是一个数组对象。

  3. jQuery.ajax

    中可在不指定dataType属性时,会根据response的content-type自动识别。
    例如:ajax请求返回的对象是json类型(application/json),则dataType会自动指定为”json”(不指定的情况下)。

  4. jQuery.ajax请求中,添加对Etag的支持。

    之前jQuery在ajax请求中是在header中不发送If-None-Match值的(也就是不支持Etag),也就默认忽略了浏览器缓存。现在可以通过指定ifModified属性开启它。

    提示:如果您不了解http header的相关知识,推荐阅读这篇文章

  5. 使用原生的JSON.parse,对json进行严格解析

    在1.3及更早版本中,jQuery通过javascript的eval方法来解析json对象。在1.4中,如果你用的浏览器支持,则会使用原生的JSON.parse进行json对象解析,这样对json对象的书写验证则更为严格。如:{foo: “bar”}的写法将不会被验证为合法的json对象,必须写成{”foo”: “bar”}。如果你的程序打算升级到1.4版本,那么这一点要尤其注意了。

  6. 在使用.serialize() 序列化时,添加对HTML5元素的支持
  7. 为ajax请求添加上下文支持,参考jQuery.ajax()
    jQuery.ajax({
        url: "test.html",
        context: document.body,
        success: function(){
            jQuery(this).addClass("done");
        }
    });
  8. jQuery.ajax()请求时,接收XMLHttpRequest对象作为success的第三个参数
  9. 在ajax请求时,总是设定Content-Type属性

    在1.3版本中,如果ajax发送的数据为空时,则不发送Content-Type属性值,1.4中则总是显式设定Content-Type值。这是因为有些程序后端通过Content-Type值判断如何响应。

  10. 当用jsonp方式进行ajax请求时,可以显式指定callback的名称

    之前jsonp的callback名称是由jQuery生成的随机名称,现在可以通过jsonpCallback参数显式指定

  11. 部分CSS相关方法被重写。其中,.css()方法效率有两倍的提升, .addClass()、.removeClass()和.hasClass()效率有三倍的提升。.toggleClass() 方法可以一次切换多个class
    $("div").toggleClass("current active");
  12. 在jQuery 1.4中,许多dom操作相关方法在性能上大幅提升

    其中.append()、 .prepend()、.before()、和 .after() 的性能被改善,
    .html() 的性能提升了近3倍。
    .remove() 和 .empty()的性能提升了近4倍。

  13. jQuery(”tag”)效率有所提升

    当传入一个tag名称进行寻找时,搜索算法有所改进 。

  14. 使用id开始的选择器获取元素的速度进一步提升

    类似于jQuery(’#id p’)这样以id开始的选择器获取元素的速度有所优化,速度是最快的。

  15. jQuery()(或$())将返回jQuery空对象

    在之前当调用jQuery()时,默认返回的是document的jQuery对象,也就是等价于jQuery(’document’)。在1.4版本中将不再做这样的转换,直接返回jQuery空对象。

    在1.4中,之前jQuery().ready()的写法不建议使用(虽然仍然可以用),应当写作jQuery(document).ready()或jQuery(function(){})

  16. 添加了新事件.focusin()和.focusout()

    .focusin()和.focusout()方法等价于focus()和blur()方法,不同的是支持事件冒泡。需要注意的是focus()和blur()事件依然不可以通过live()方法绑定。

  17. 几乎所有事件都支持live()绑定

    除了ready、focus(用focusin替代)、blur(用focusout替代)事件外的所有事件都支持live绑定

  18. jQuery 1.4对内部结构重新组织,并开始建立代码风格规范

    之前的core.js被划分为attribute.js, css.js, data.js, manipulation.js, traversing.js和queue.js。ready事件被移至core.js中。

    jQuery 1.4开始建立了代码风格规范,大多数核心代码符合这一规范。虽然这个规范仅有几条,但我相信这是一个良好的开端。

【相关测试】

在jQuery 1.4中解决了207个bug(相比之下,1.3解决了97个bug)。

此外,测试用例从1.3.2的1504个增加了1.4版本的3060个。这些测试100%通过当下主流浏览器(Safari 3.2, Safari 4, Firefox 2, Firefox 3, Firefox 3.5, IE 6, IE 7, IE 8, Opera 10.10, 和 Chrome)。

【版本兼容性处理】

从上面还是可以看出1.4是做了相当多的更新,为了保证当前版本的向后兼容(也就是希望你之前使用jQuery 1.3版本的程序平稳过渡到1.4版本上),官方特意提供了兼容性脚本补丁,如下使用:

     <script src="http://code.jquery.com/jquery.js"></script>
     <script src="http://code.jquery.com/jquery.compat-1.3.js"></script>

注:以上内容以jQuery官方文档为依据撰写而成,更加详细内容可直接访问官方说明页面。

posted @ 2010-04-21 16:35  Kimura  Views(196)  Comments(0Edit  收藏  举报