任何程序代碼不是一開(kāi)始就復(fù)雜的,成功也不是一躇而蹴的,早期jQuery的作者John Resig在2005年提議改進(jìn)Prototype的“Behaviour”庫(kù)時(shí),只是想讓其使用更簡(jiǎn)單才發(fā)布新的jQuery框架。起初John Resig估計(jì)也沒(méi)料想jQuery會(huì)如此的火熱。我們可以看到從發(fā)布的第一個(gè)1.0開(kāi)始到目前最新的2.1.1其代碼膨脹到了9000多行,它兼容CSS3,還兼容各種瀏覽器,jQuery使用戶(hù)能更方便地處理DOM、事件、實(shí)現(xiàn)動(dòng)畫(huà)效果,并且方便地為網(wǎng)站提供AJAX交互。
1、最新jQuery2.1.1版本的結(jié)構(gòu):
代碼請(qǐng)查看右側(cè)代碼編輯器(1-24行)
(單擊圖片可放大)
jQuery一共13個(gè)模塊,從2.1版開(kāi)始jQuery支持通過(guò)AMD模塊劃分,jQuery在最開(kāi)始發(fā)布的1.0版本是很簡(jiǎn)單的,只有CSS選擇符、事件處理和AJAX交互3大塊。其發(fā)展過(guò)程中,有幾次重要的變革:
? 1.2.3 版發(fā)布,引入數(shù)據(jù)緩存,解決循環(huán)引用與大數(shù)據(jù)保存的問(wèn)題 ? 1.3 版發(fā)布,它使用了全新的選擇符引擎Sizzle,在各個(gè)瀏覽器下全面超越其他同類(lèi)型JavaScript框架的查詢(xún)速度,程序庫(kù)的性能也因此有了極大提升 ? 1.5 版發(fā)布,新增延緩對(duì)像(Deferred Objects),并用deferred重寫(xiě)了Ajax模塊 ? 1.7 版發(fā)布,抽象出回調(diào)對(duì)象,提供了強(qiáng)大的的方式來(lái)管理回調(diào)函數(shù)列表。
每一次大的改進(jìn)都引入了一些新的機(jī)制、新的特性,通過(guò)這些新的機(jī)制就造就了如今jQuery庫(kù),一共13個(gè)模塊,模塊不是單一的,比如jQuery動(dòng)畫(huà),都會(huì)依賴(lài)異步隊(duì)列、動(dòng)畫(huà)隊(duì)列、回調(diào)隊(duì)列與數(shù)據(jù)緩存模塊等。
jQuery抽出了所有可復(fù)用的特性,分離出單一模塊,通過(guò)組合的用法,不管在設(shè)計(jì)思路與實(shí)現(xiàn)手法上jQuery都是非常高明的。
五大塊:
jQuery按我的理解分為五大塊,選擇器、DOM操作、事件、AJAX與動(dòng)畫(huà),那么為什么有13個(gè)模塊?因?yàn)閖Query的設(shè)計(jì)中最喜歡的做的一件事,就是抽出共同的特性使之“模塊化”,當(dāng)然也是更貼近S.O.L.I.D五大原則的“單一職責(zé)SRP”了,遵守單一職責(zé)的好處是可以讓我們很容易地來(lái)維護(hù)這個(gè)對(duì)象,比如,當(dāng)一個(gè)對(duì)象封裝了很多職責(zé)的時(shí)候,一旦一個(gè)職責(zé)需要修改,勢(shì)必會(huì)影響該對(duì)象的其它職責(zé)代碼。通過(guò)解耦可以讓每個(gè)職責(zé)更加有彈性地變化。
我們來(lái)看看jQuery文檔針對(duì)業(yè)務(wù)層的Ajax的處理提供了一系列的門(mén)面接口:
.ajaxComplete() .ajaxError() .ajaxSend() .ajaxStart() .ajaxStop() .ajaxSuccess()
底層接口:
jQuery.ajax() jQuery.ajaxSetup()
快捷方法:
jQuery.get() jQuery.getJSON() jQuery.getScript() jQuery.post()
業(yè)務(wù)邏輯是復(fù)雜多變的,jQuery的高層API數(shù)量非常多,而且也非常的細(xì)致,這樣做可以更友好的便于開(kāi)發(fā)者的操作,不需要必須在一個(gè)接口上重載太多的動(dòng)作。我們?cè)谏钊雰?nèi)部看看Ajax的高層方法其實(shí)都是統(tǒng)一調(diào)用了一個(gè)靜態(tài)的jQuery.ajax方法,代碼見(jiàn)右側(cè)代碼編輯器(27-43行)。
在jQuery.ajax的內(nèi)部實(shí)現(xiàn)是非常復(fù)雜的,首先ajax要考慮異步的處理與回調(diào)的統(tǒng)一性,所以就引入了異步隊(duì)列模塊(Deferred)與回調(diào)模塊(Callbacks), 所以要把這些模塊方法在ajax方法內(nèi)部再次封裝成、構(gòu)建出一個(gè)新的jQXHR對(duì)象,針對(duì)參數(shù)的默認(rèn)處理,數(shù)據(jù)傳輸?shù)母袷交鹊取?/p>
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開(kāi)微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書(shū)簽
舉報(bào)