自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

jQuery1.5的六大細(xì)節(jié)改進(jìn):DOM操作更簡單

開發(fā) 前端
jQuery 1.5 beta1出來了,這個(gè)1.5版本最大的更新是AJAX的完全重寫,提供了更強(qiáng)的可擴(kuò)展性。但是受制于精力和篇幅,對新的AJAX的分析還是放到下回,本篇先簡單介紹一下細(xì)節(jié)方面的改進(jìn)。

jQuery 1.5 beta1出來了,從學(xué)習(xí)跟進(jìn)上來說,這一次已經(jīng)比較晚了(我竟然不知道1.5什么時(shí)候出的alpha,就這么beta了)。

這個(gè)1.5版本最大的更新是AJAX的完全重寫,提供了更強(qiáng)的可擴(kuò)展性。但是受制于精力和篇幅,對新的AJAX的分析還是放到下回,本篇先簡單介紹一下細(xì)節(jié)方面的改進(jìn)。

jQuery._Deferred和jQuery.Deferred

首先不得不說這兩個(gè)新生事物,因?yàn)樗麄兪亲鳛榛A(chǔ)設(shè)施存在,不把這兩個(gè)東西講明白了,有些問題根本沒辦法解釋。

首先,jQuery.Deferred是jQuery._Deferred的增強(qiáng)版,因此對于這個(gè)問題,從jQuery._Deferred入手,就能說明一大半的問題。

什么是Deferred?從字面上看,我的第一反應(yīng)是“延遲加載”,首字母大寫的應(yīng)該是“類型”的定義,所以這大概是一個(gè)“透明提供延遲加載功能”的類型吧。然而實(shí)際上,雖然確實(shí)帶有那么一點(diǎn)點(diǎn)“延遲”的意思,這個(gè)東西卻不是用來實(shí)現(xiàn)延遲加載的。

簡單來說,jQuery._Deferred是一個(gè)函數(shù)隊(duì)列,他的作用有以下幾點(diǎn):

  • 保存若干個(gè)函數(shù)。
  • 在特定的時(shí)刻把保存著的函數(shù)全部執(zhí)行掉。
  • 執(zhí)行過后,新進(jìn)來的函數(shù)會立刻執(zhí)行。

感覺是不是和啥東西很像?對,jQuery的ready函數(shù)就是這樣的邏輯,實(shí)際中jQuery 1.5中的ready函數(shù)也確實(shí)被嫁接到這上面去了。

jQuery._Deferred提供下面的接口:

  • done:function(fn1, fn2, ...)的形式,用于把函數(shù)添加到隊(duì)列中。
  • fire:function(context, args)的形式,使用context指定this對象,args指定參數(shù),調(diào)用隊(duì)列中所有函數(shù)。fire被調(diào)用后,_Deferred會進(jìn)入isResolved狀態(tài),未來對done的調(diào)用不會再保存函數(shù),而是直接調(diào)用函數(shù)。
  • resolve:相當(dāng)于調(diào)用fire(this, arguments),一個(gè)簡化的方法。
  • isResolved:用來判斷_Deferred是否在isResolved狀態(tài),具體參考前面的fire函數(shù)的解釋。
  • cancel:取消掉整個(gè)隊(duì)列,這樣不管未來是不是fire,隊(duì)列中的函數(shù)都不會再被調(diào)用。

說明白了jQuery._Deferred,再來看看jQuery.Deferred。這個(gè)東西其實(shí)就是2個(gè)_Deferred組成的,第一個(gè)稱為deferred,用于保管“正?!睜顟B(tài)下的函數(shù);第二個(gè)稱為failDeferred,用于保管“出錯(cuò)”狀態(tài)下的函數(shù)。同時(shí)jQuery.Deferred提供了一些新的接口:

  • then:function(done, fail)的形式,把done添加進(jìn)deferred,把fail添加進(jìn)failedDeferred。
  • fail:相當(dāng)于failDeferred的done函數(shù)。
  • fireReject:相當(dāng)于failDeferred的fire函數(shù)。
  • reject:相當(dāng)于failDeferred的resolve函數(shù)。
  • isRejected:相當(dāng)于failDeferred的isResolved函數(shù)。

同時(shí)jQuery.Deferred取消了cancel函數(shù)。

那么這個(gè)是啥用的呢?有“正常”和“出錯(cuò)”2個(gè)狀態(tài),同時(shí)又是異步的,很容易就能想到……對,給AJAX用的,在下一篇分析中再詳細(xì)說明。

jQuery.ready的變化

因?yàn)橛辛薺Query._Deferred這個(gè)東西,jQuery.ready函數(shù)變成依賴于函數(shù)隊(duì)列,具體的變化有:

原來的readyList變量已經(jīng)不再是一個(gè)數(shù)組,而變成了jQuery._Deferred對象。

原本在DOMContentLoaded時(shí),調(diào)用readList中所有函數(shù)的邏輯,現(xiàn)在也使用了jQuery._Deferred中,原來的代碼:

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

變成了:

  1. readyList.fire( document , [ jQuery ] ); 

jQuery.parseXML函數(shù)

新增了靜態(tài)函數(shù)jQuery.parseXML,用于提供瀏覽器兼容的從字符串轉(zhuǎn)為XML文檔的功能。

該函數(shù)的邏輯網(wǎng)上有很多,jQuery也沒有特別的地方,大致分為以下2種:

對于標(biāo)準(zhǔn)瀏覽器,使用DOMParser對象:

  1. var parser = new DOMParser();  
  2. var xml = parser.parseFromString(text, 'text/html'); 

對于IE,使用Microsoft.XMLDOM對象:

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

data部分

添加了jQuery.hasData函數(shù),用于判斷一個(gè)元素是否有jQuery附加上去的數(shù)據(jù)。

修改了jQuery.expando的實(shí)現(xiàn),在原來單純地取當(dāng)前時(shí)間的基礎(chǔ)上,添加了一個(gè)隨機(jī)數(shù):

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

這樣保證在同一時(shí)間,引入多個(gè)jQuery副本,這幾個(gè)副本之間的expando不會相互沖突,導(dǎo)致元素上的data變得錯(cuò)亂。一般來說,是不會引入多個(gè)jQuery副本的,但是使用SealJS等的時(shí)候,配置不當(dāng)?shù)脑?,也是很容易出現(xiàn)此類問題的。

DOM操作部分

原本的hasClass、addClass、removeClass函數(shù)都需要將元素的class屬性分隔為數(shù)組,在1.4.4版本中,通過\n或\t進(jìn)行分隔,在1.5中增加了一個(gè)\r,用于對應(yīng)Windows平臺下的換行符(\r\n)。

jQuery.fn.attr函數(shù),1.4.4版本中拒絕從TextNode和CommentNode上獲取屬性,在1.5版本中添加了一個(gè)AttributeNode(noteType == 2)。

在1.4.4版本中,jQuery會在頁面unload的時(shí)候清理掉由jQuery維護(hù)的所有DOM事件,這是為了避免IE的內(nèi)存泄露問題。但是在1.5中這一段代碼不見了,不知是出于什么考慮。

對于IE下使用cloneNode復(fù)制節(jié)點(diǎn),會將事件也一起復(fù)制過來的問題,1.4.4中是采取復(fù)制innerHTML的方式給予解決,而在1.5中則采納了mootools團(tuán)隊(duì)提供的方法,使用cloneFixAttribute函數(shù)修正該問題。

cloneFixAttribute函數(shù)們于jQuery 1.5 beta1源碼文件的5388-5438行,處理IE的BUG的原理很簡單,當(dāng)然前端里一些看似簡單的東西,都是很難發(fā)現(xiàn)的:

  • IE中有個(gè)叫clearAttributes的函數(shù),會清除到節(jié)點(diǎn)上的所有屬性,順便把和事件相關(guān)的onclick之類的屬性也去掉了。在復(fù)制出來的節(jié)點(diǎn)上調(diào)用這個(gè)函數(shù),就會把屬性清得干干凈凈。
  • IE中還有一個(gè)叫mergeAttributes的函數(shù),把一個(gè)節(jié)點(diǎn)的屬性復(fù)制到另一個(gè)節(jié)點(diǎn)上,但他不會把和事件相關(guān)的屬性復(fù)制過去。所以再把原始節(jié)點(diǎn)調(diào)用mergeAttributes,把屬性重新放回復(fù)制出來的節(jié)點(diǎn)上,這就相當(dāng)于起到了去除事件相關(guān)屬性的作用。

另外cloneFixAttribute函數(shù)還處理了非常多IE6-8在cloneNode上的兼容性問題,非常值得詳細(xì)研究。

AJAX部分

AJAX已經(jīng)完全重寫了,只留下一點(diǎn)邊邊角角保留著1.4.4版本的風(fēng)采,這里只抽取一部分進(jìn)行簡單的說明。

原來版本中$.get和$.post的實(shí)現(xiàn)非常相似,具體來說僅有一個(gè)method配置項(xiàng)不同,因此在1.5版本中被合并起來了:

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

ajaxSetup函數(shù)現(xiàn)在加了一行return this;,可以鏈?zhǔn)秸{(diào)用了。

serializeArray函數(shù)現(xiàn)在統(tǒng)一將value中的換行符替換成Windows的風(fēng)格(\r\n)。

AJAX的回調(diào)函數(shù)中,作為參數(shù)的對象不再是原生的XMLHTTPRequest,而是jQuery自己封裝的稱為jXHR的對象,這個(gè)對象提供了XMLHTTPRequest的常用接口。

原本對于“請求成功”的瀏覽器狀態(tài)碼,除200-299以及304外,還有一個(gè)1223,來自于IE的一個(gè)BUG,會將204的狀態(tài)碼變成1223。現(xiàn)在因?yàn)橛辛薺XHR對象,相當(dāng)于中間多了一層,因此從jXHR對象獲取statusCode不會出現(xiàn)1223的情況,已經(jīng)被變回204了。

jQuery.ajax函數(shù)的配置項(xiàng)中多了一個(gè)statusCode項(xiàng),其結(jié)構(gòu)為map,用于指定返回特定狀態(tài)碼時(shí)的回調(diào)函數(shù),大致形式如下:

  1. jQuery.ajax({  
  2. url: 'xxx',  
  3. statusCode: {  
  4. 200: function() { 處理請求成功 },  
  5. 404: function() { 處理頁面未找到 },  
  6. 503: function() { 處理Service Unavailable }  
  7. }  
  8. });  

再添加了這個(gè)回調(diào)后,jQuery.ajax函數(shù)已經(jīng)有非常多的回調(diào)函數(shù),其觸發(fā)過程如下:

  • 根據(jù)返回的狀態(tài)碼,觸發(fā)success或者error回調(diào)。
  • 根據(jù)狀態(tài)碼,觸發(fā)對應(yīng)的statusCode回調(diào)。
  • 觸發(fā)complete回調(diào)。
  • 觸發(fā)全局ajaxComplete回調(diào)。
  • 如果此時(shí)沒有正在執(zhí)行的AJAX,觸發(fā)全局ajaxStop回調(diào)。

其他細(xì)節(jié)

入口函數(shù)jQuery.fn.init現(xiàn)在多了一個(gè)參數(shù),值始終為rootjQuery,用于加速init函數(shù)中對rootjQuery變量的查找速度(減少了一層作用域):

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

jQuery對象支持繼承了,具體的修改是將幾處直接調(diào)用jQuery的代碼改為了對this.constructor的調(diào)用:

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

同時(shí)還提供了jQuery.subclass函數(shù)用于創(chuàng)建一個(gè)繼承自jQuery的類型,由于不是很常用jQuery,更是從來沒有用到過需要繼承jQuery的情況,因此也不方便說這個(gè)功能的作用有多大。

原文鏈接:http://www.otakustay.com/jquery-1-5-enhanced-detail/

【編輯推薦】

  1. jQuery 1.5第一個(gè)Beta版發(fā)布 付下載
  2. jQuery入門:數(shù)組的三種類型三種操作
責(zé)任編輯:陳貽新 來源: Gray Zhang的博客
相關(guān)推薦

2011-01-21 15:02:14

jQuerywebJavaScript

2016-12-01 13:43:27

智慧城市物聯(lián)網(wǎng)

2011-06-10 13:49:58

SEO

2009-08-28 15:25:38

C#線程操作

2024-10-22 14:42:14

2009-12-04 17:01:18

Windows 7操作

2012-04-23 10:08:53

2016-08-18 21:55:00

2011-03-16 10:44:19

2023-07-24 11:01:32

2023-05-11 11:36:56

云計(jì)算云供應(yīng)商

2010-09-09 10:54:58

2013-08-23 10:18:06

Hadoop

2016-07-06 11:16:47

2023-08-31 22:12:51

低代碼隱患技術(shù)

2022-01-23 10:44:39

零信任網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2013-08-23 10:42:03

Hadoop

2021-08-12 14:31:52

邊緣計(jì)算云計(jì)算數(shù)據(jù)

2010-08-16 10:14:23

云計(jì)算誤區(qū)

2010-09-25 15:22:19

DHCP故障處理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號