`
flycomos.lee
  • 浏览: 279928 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JQUERY 1.5 新特性

阅读更多

jQuery 1.5 beta1出来了,从学习跟进上来说,这一次已经比较晚了(我竟然不知道1.5什么时候出的alpha,就这么beta了)。

这个1.5版本最大的更新是AJAX的完全重写,提供了更强的可扩展性。但是受制于精力和篇幅,对新的AJAX的分析还是放到下回,本篇先简单介绍一下细节方面的改进。

jQuery._Deferred和jQuery.Deferred

首先不得不说这两个新生事物,因为他们是作为基础设施存在,不把这两个东西讲明白了,有些问题根本没办法解释。

首先,jQuery.Deferred是jQuery._Deferred的增强版,因此对于这个问题,从jQuery._Deferred入手,就能说明一大半的问题。

什么是Deferred?从字面上看,我的第一反应是“延迟加载”,首字母大写的应该是“类型”的定义,所以这大概是一个“透明提供延迟加载功能”的类型吧。然而实际上,虽然确实带有那么一点点“延迟”的意思,这个东西却不是用来实现延迟加载的。

简单来说,jQuery._Deferred是一个函数队列,他的作用有以下几点:

  • 保存若干个函数。
  • 在特定的时刻把保存着的函数全部执行掉。
  • 执行过后,新进来的函数会立刻执行。

感觉是不是和啥东西很像?对,jQuery的ready函数就是这样的逻辑,实际中jQuery 1.5中的ready函数也确实被嫁接到这上面去了。

jQuery._Deferred提供下面的接口:

  • done:function(fn1, fn2, ...)的形式,用于把函数添加到队列中。
  • fire:function(context, args)的形式,使用context指定this对象,args指定参数,调用队列中所有函数。fire被调用后,_Deferred会进入 isResolved状态,未来对done的调用不会再保存函数,而是直接调用函数。
  • resolve:相当于调用fire(this, arguments),一个简化的方法。
  • isResolved:用来判断_Deferred是否在isResolved状态,具体参考前面的fire函数的解释。
  • cancel:取消掉整个队列,这样不管未来是不是fire,队列中的函数都不会再被调用。

说明白了jQuery._Deferred,再来看看jQuery.Deferred。这个东西其实就是2个_Deferred组成的,第一个称为 deferred,用于保管“正常”状态下的函数;第二个称为failDeferred,用于保管“出错”状态下的函数。同时 jQuery.Deferred提供了一些新的接口:

  • then:function(done, fail)的形式,把done添加进deferred,把fail添加进failedDeferred。
  • fail:相当于failDeferred的done函数。
  • fireReject:相当于failDeferred的fire函数。
  • reject:相当于failDeferred的resolve函数。
  • isRejected:相当于failDeferred的isResolved函数。

同时jQuery.Deferred取消了cancel函数。

那么这个是啥用的呢?有“正常”和“出错”2个状态,同时又是异步的,很容易就能想到……对,给AJAX用的,在下一篇分析中再详细说明。

jQuery.ready的变化

因为有了jQuery._Deferred这个东西,jQuery.ready函数变成依赖于函数队列,具体的变化有:

原来的readyList变量已经不再是一个数组,而变成了jQuery._Deferred对象。

原本在DOMContentLoaded时,调用readList中所有函数的逻辑,现在也使用了jQuery._Deferred中,原来的代码:

while ( (fn = ready[ i++ ]) ) {
    fn.call( document, jQuery );
}

变成了:

readyList.fire( document , [ jQuery ] );

jQuery.parseXML函数

新增了静态函数jQuery.parseXML,用于提供浏览器兼容的从字符串转为XML文档的功能。

该函数的逻辑网上有很多,jQuery也没有特别的地方,大致分为以下2种:

  • 对于标准浏览器,使用DOMParser对象:

    var parser = new DOMParser();
    var xml = parser.parseFromString(text, 'text/html');
    
    
  • 对于IE,使用Microsoft.XMLDOM对象:

    var parser = new ActiveXObject('Microsoft.XMLDOM');
    parser.async = 'false';
    parser.loadXML(text);
    var xml = parser.documentElement;
    
    

data部分

添加了jQuery.hasData函数,用于判断一个元素是否有jQuery附加上去的数据。

修改了jQuery.expando的实现,在原来单纯地取当前时间的基础上,添加了一个随机数:

expando = "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" );

这样保证在同一时间,引入多个jQuery副本,这几个副本之间的expando不会相互冲突,导致元素上的data变得错乱。一般来说,是不会引入多个jQuery副本的,但是使用SealJS等的时候,配置不当的话,也是很容易出现此类问题的。

DOM操作部分

原本的hasClass、addClass、removeClass函数都需要将元素的class属性分隔为数组,在1.4.4版本中,通过\n或\t进行分隔,在1.5中增加了一个\r,用于对应Windows平台下的换行符(\r\n)。

jQuery.fn.attr函数,1.4.4版本中拒绝从TextNode和CommentNode上获取属性,在1.5版本中添加了一个AttributeNode(noteType == 2)。

在1.4.4版本中,jQuery会在页面unload的时候清理掉由jQuery维护的所有DOM事件,这是为了避免IE的内存泄露问题。但是在1.5中这一段代码不见了 ,不知是出于什么考虑。

对于IE下使用cloneNode复制节点,会将事件也一起复制过来的问题,1.4.4中是采取复制innerHTML的方式给予解决,而在1.5中则采纳了mootools团队提供的方法,使用cloneFixAttribute函数修正该问题。

cloneFixAttribute函数们于jQuery 1.5 beta1源码文件的5388-5438行,处理IE的BUG的原理很简单,当然前端里一些看似简单的东西,都是很难发现的:

  1. IE中有个叫clearAttributes的函数,会清除到节点上的所有属性,顺便把和事件相关的onclick之类的属性也去掉了。在复制出来的节点上调用这个函数,就会把属性清得干干净净。
  2. IE中还有一个叫mergeAttributes的函数,把一个节点的属性复制到另一个节点上,但他不会把和事件相关的属性复制过去。所以再把原始节点调用mergeAttributes,把属性重新放回复制出来的节点上,这就相当于起到了去除事件相关属性的作用。

另外cloneFixAttribute函数还处理了非常多IE6-8在cloneNode上的兼容性问题,非常值得详细研究。

AJAX部分

AJAX已经完全重写了,只留下一点边边角角保留着1.4.4版本的风采,这里只抽取一部分进行简单的说明。

原来版本中$.get和$.post的实现非常相似,具体来说仅有一个method配置项不同,因此在1.5版本中被合并起来了:

$.each(['get', 'post'], function(i, method) {
    $[method] = function() { ... };
});

ajaxSetup函数现在加了一行return this; ,可以链式调用了。

serializeArray函数现在统一将value中的换行符替换成Windows的风格(\r\n)。

AJAX的回调函数中,作为参数的对象不再是原生的XMLHTTPRequest,而是jQuery自己封装的称为jXHR的对象,这个对象提供了XMLHTTPRequest的常用接口。

原本对于“请求成功”的浏览器状态码,除200-299以及304外,还有一个1223,来自于IE的一个BUG,会将204的状态码变成 1223。现在因为有了jXHR对象,相当于中间多了一层,因此从jXHR对象获取statusCode不会出现1223的情况,已经被变回204了。

jQuery.ajax函数的配置项中多了一个statusCode项,其结构为map,用于指定返回特定状态码时的回调函数,大致形式如下:

jQuery.ajax({
    url: 'xxx',
    statusCode: {
        200: function() { 处理请求成功 },
        404: function() { 处理页面未找到 },
        503: function() { 处理Service Unavailable }
    }
});

再添加了这个回调后,jQuery.ajax函数已经有非常多的回调函数,其触发过程如下:

  1. 根据返回的状态码,触发success或者error回调。
  2. 根据状态码,触发对应的statusCode回调。
  3. 触发complete回调。
  4. 触发全局ajaxComplete回调。
  5. 如果此时没有正在执行的AJAX,触发全局ajaxStop回调。

其他细节

入口函数jQuery.fn.init现在多了一个参数,值始终为rootjQuery,用于加速init函数中对rootjQuery变量的查找速度(减少了一层作用域):

//jQuery 1.5 beta1 源码23行
jQuery = function( selector, context ) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init( selector, context, rootjQuery );
}

jQuery对象支持继承了,具体的修改是将几处直接调用jQuery的代码改为了对this.constructor的调用:

202行:return this.constructor( context ).find( selector );
253行:var ret = this.constructor();
334行:return this.prevObject || this.constructor(null);

同时还提供了jQuery.subclass函数用于创建一个继承自jQuery的类型,由于不是很常用jQuery,更是从来没有用到过需要继承jQuery的情况,因此也不方便说这个功能的作用有多大。

分享到:
评论

相关推荐

    jquery 1.5版本类库

    9. **文档和社区**:jQuery 1.5的发布伴随着详细的文档更新,帮助开发者了解新特性和使用方法。同时,活跃的社区提供了解决问题和分享经验的平台。 10. **版本大全类库**:"JQuery1_5大全js"可能包含jQuery 1.5的...

    JQuery1.5中文版

    ### jQuery 1.5特性 1. **优化的性能**:jQuery 1.5对核心代码进行了优化,提高了执行效率,尤其是在DOM遍历和选择器匹配方面。 2. **更强大的AJAX支持**:新版本加强了AJAX功能,引入了`$.ajax()`方法的`context`...

    jqueryapi jquery1.5api jquery1.5

    jQuery的核心特性之一就是链式操作。通过返回jQuery对象,我们可以连续调用多个方法,如`$('div').addClass('highlight').fadeOut(500)`,这使得代码更加简洁。 ### 3. DOM操作(DOM Manipulation) - `$(selector...

    jQuery 1.5

    总之,jQuery 1.5是jQuery发展史上的一个重要里程碑,它的新特性极大地提升了开发效率和用户体验。无论是对于初学者还是经验丰富的开发者,深入理解和掌握jQuery 1.5都能显著提升他们的前端技能。

    jQuery 1.5 Javascript

    jQuery 1.5版本是jQuery库发展史上的一个重要里程碑,它带来了许多优化和新特性,为开发者提供了更高效、更强大的JavaScript编程工具。在这个版本中,jQuery的核心功能得到了显著提升,同时保持了其一贯的易用性,...

    JQuery 1.5 API 中文版 html索引版

    版本1.5是jQuery历史上的一个重要里程碑,引入了许多增强功能和性能优化,使得开发者在创建动态网页时更加得心应手。 1. **jQuery选择器** jQuery 1.5中包含了一系列强大的选择器,如基本选择器(ID,类,标签),...

    最新jQuery1.5中文教程和开发包

    ### jQuery 1.5的关键特性 1. **Deferred对象与Promise接口**:jQuery 1.5引入了一个全新的 Deferred 对象,用于处理异步操作。 Deferred 提供了一种统一的方式来管理和链式异步操作,使得异步编程变得更加简单。...

    jquery1.5中文API

    jQuery 1.5版本在前一版本的基础上进行了优化和增强,提升了性能,并添加了一些新特性。 **API**(Application Programming Interface)是软件开发者用来与程序进行交互的一系列接口、工具和协议的集合。jQuery 1.5...

    jquery1.5.js和开发文档

    jQuery 1.5是该库的一个重要版本,带来了许多性能优化和新特性。 二、jQuery 1.5.js的关键特性 1. **选择器增强**:jQuery 1.5对CSS3选择器的支持进一步加强,使得开发者能够更加灵活地选取DOM元素。 2. **Deferred...

    jquery 1.5 1.6 1.7

    本文将深入探讨jQuery 1.5、1.6及1.7这三个重要版本中的关键特性、改进与最佳实践,旨在帮助开发者更高效地利用这些版本来提升项目性能和用户体验。 一、jQuery 1.5:Promise对象与 Deferred对象的引入 1.5版本...

    JQuery 1.5 API 中文版索引版

    对不起,我似乎误解了您的需求...要了解更多JQuery 1.5的API详情,建议查阅官方文档或相关的中文翻译版,这将帮助您理解和使用这个版本的所有特性。在实际开发中,掌握这些知识点能有效地提高您的JavaScript开发效率。

    jquery 1.5 到2.13 全套

    1. jQuery 1.5:核心改进与新特性 - Deferred对象:1.5版本引入了Deferred对象,用于处理异步操作,如Ajax请求,使其更易于管理和链式调用。 - 兼容性提升:提升了与旧版IE浏览器的兼容性,同时优化了遍历和选择器...

    jQuery1.5之后的ajax共7页.pdf.zip

    【jQuery1.5之后的Ajax技术详解】 Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。自jQuery1.5版本以来,jQuery对Ajax功能进行了大量的优化和增强,使得...

    jquery1.5开发手册html版本

    1.5版本在前一版的基础上进行了优化和增强,提升了性能,并添加了一些新特性。 1. **jQuery选择器**:jQuery 1.5提供了丰富多样的选择器,如ID选择器(#id),类选择器(.class),元素选择器(element),以及组合选择器...

    jQuery1.5简体中文API,包好的一个帮助文档

    在jQuery 1.5版本中,以下特性尤为突出: - **Deferred对象**:引入了Promise模式,更好地处理异步操作,使代码更加可读和可维护。 - **$.ajax的增强**:增加了全局和局部的`beforeSend`, `success`, `error`等回调...

    jquery-1.5.zip

    本文将深入探讨jQuery 1.5的核心特性,以及它在压缩包中的主要文件。 首先,我们关注的是标题中的"jquery-1.5.zip",这是一个包含jQuery库1.5版本的压缩文件。在JavaScript的世界里,jQuery扮演着简化DOM操作、处理...

    jQuery 1.5-1.85各版本涵中英文帮助

    **jQuery 1.5-1.85 版本详解** jQuery 是一款广泛使用的JavaScript库,它极大地简化了JavaScript的DOM操作、...通过深入学习这些版本中的新特性和变化,开发者可以更好地利用jQuery进行Web开发,提高项目质量和效率。

    jdk1.8中文API及jQuery1.5中文API

    JDK 1.8是Java开发工具包的一个重要版本,它引入了许多新特性和优化,增强了Java编程语言的功能和效率。以下是一些关键知识点: 1. **Lambda表达式**:这是JDK 1.8最重要的特性之一,它提供了一种简洁的方式来表示...

    jquery-1.5.js及其API下载

    ### jQuery 1.5.js 的主要特性 1. **高效性能**:jQuery 1.5对内部机制进行了优化,提高了代码执行速度,尤其在DOM操作和事件处理方面。 2. **Deferred 对象**:这是1.5版本引入的一个重要特性,用于处理异步操作...

    jQuery 1.5 API 中文版

    1.5版本是jQuery历史上的一个重要里程碑,它引入了许多改进和新特性,旨在提高性能、增强灵活性以及简化DOM操作。本篇文章将深入探讨jQuery 1.5 API中文版中的关键知识点。 一、选择器(Selectors) jQuery的选择器...

Global site tag (gtag.js) - Google Analytics