欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jQuery 源碼分析筆記(2) 變量列表

 更新時間:2011年05月28日 00:51:09   作者:  
在初始化jQuery對象的代碼開始之前聲明了一大堆變量。主要包括:全局變量的備份;處理字符串用的正則表達式;檢測瀏覽器的正則表達式;對核心函數(shù)的引用備份。這里略過大部分,只說兩種:全局變量和瀏覽器檢測。
_jQuery = window.jQuery;
_$ = window.$;
這兩個變量是jQuery唯一使用的兩個全局變量。在jQuery.noConflict()函數(shù)中,會把這兩個變量恢復回去。
對于瀏覽器檢測,jQuery使用的是檢查UserAgent,而沒有使用特性檢測。
rwebkit = /(webkit)[ \/]([\w.]+)/,
ropera = /(opear)(?:.*version)?[ \/](\w+)/,
rmsie = /(msie) ([\w.]+)/,
rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
初始化函數(shù)init
jQuery對JS對象的處理比較繞,而最終目的就是把jQuery選擇器得到的結果變成和數(shù)組差不多的一個對象。有l(wèi)ength,first,last等。因為$("...")就是從DOM樹從選擇一些節(jié)點出來。但是,$還有很多其他功能,比如常用的$(function() { ... })用來頁面加載后初始化執(zhí)行,$("<..>...</...>")來直接得到一個節(jié)點,用來append到DOM樹中。
接下來從93行開始就是很長的一段init函數(shù)。Init: function(selector, context, rootjQuery)
步驟:
1、Selector是非法參數(shù):空字符,null和undefined則直接返回this。即有默認屬性的jQuery對象。
2、Selector是DOMElement。即用原生的JS,比如getElementById等得到的元素。那么,相當于把原生的DOM對象用$包裝一次。把這個元素放到內(nèi)部數(shù)組的第一個位置,并把length設置為1。然后返回。
3、特殊優(yōu)化處理$("body")。即document.body元素。
4、Selector是以<開頭,以>結尾的字符串。那么假定是想用字符串新建一個DOM元素。比如$("<a )。為了安全起見,這里使用了一個正則表達式來檢查,到底是<...>...</...>形式還是#id的形式。
quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/。在quickExpr.exec(selector)后,如果是HTML字符串,那么會得到[match, match, undefined],而#id形式會得到[#id, undefined, id]的結果。這樣就把字符串區(qū)別開了。
對于HTML字符串,如果只有一個tag,那么直接調(diào)用createElement。否則調(diào)用一個createFragment輔助函數(shù),這個函數(shù)使用createDocumentFragment,然后把所有tag都插進去。
createFragment實現(xiàn)在5892行,這里有一個值得注意的地方就是jQuery對于HTML片段做了緩存處理。而且對于不同的瀏覽器和元素有不同的處理,作者寫了大段的注釋說明。歸納起來就是(1)只緩存小于0.5KB的小片段。(2)selected狀態(tài)不緩存。(3)IE6的<object>和<embed>元素不緩存。(4)WebKit不緩存元素的checked屬性。以上這些不緩存的原因是jQuery使用克?。–lone)節(jié)點的方式進行緩存,而2-4提到的情況在Clone時會丟失。jQuery使用了正則,或者jQuery.support輔助函數(shù)來進行是否緩存的策略判斷。這里先略過。jQuery.support牽扯很多瀏覽器相關問題。
5、如果在4中檢查到是#id,則直接調(diào)用document.getElementById
6、如果selector是function,則把這個函數(shù)當作是document.ready的事件處理函數(shù)
7、剩余的各種情況,比如傳入了context等。統(tǒng)一調(diào)用一個find(selector)來處理。這個函數(shù)以后再議。(5109行,jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; 表明,其他復雜的selector表達式都扔給Sizzle項目了)
jQuery基本成員
jQuery被設計成一個行為和數(shù)組很像的對象。所以需要一些轉換方法和基本屬性。
1、jquery:版本號。最簡單的得到版本號的方式:$().jquery
2、length和size():長度。
3、toArray():轉換成JS數(shù)組
4、get(num):返回第N個元素。如果傳入null,則直接返回toArray()的結果。這里返回的就是DOMElement了。
5、pushStack():參見http://api.jquery.com/pushStack/ 。內(nèi)部new了一個新的jQuery對象,然后把elems和selector得到的結果合并進去,然后返回這個新的jQuery對象。這里有個prevObject屬性的設置,往下看end()函數(shù)。
6、each(callback, args):遍歷數(shù)組內(nèi)的元素。內(nèi)部調(diào)用了$.each Utiltiy。
7、ready(fn):其實和$(function() { })是等價的。
8、eq(i):i允許正負數(shù)字,而且返回的仍然是jQuery對象,只不過只有一個元素了。其實只是slice的包裝。
9、first()和last():其實就是eq(0)和eq(-1),很簡單的一個包裝。
10、slice():根據(jù)參數(shù)獲得數(shù)組一部分的引用。內(nèi)部使用pushStack實現(xiàn)的。所以返回的也是一個新的jQuery對象。
11、map(callback):對每個元素依次調(diào)用callback。把原來的元素A的數(shù)組映射為元素B的數(shù)組。callback就是元素A->元素B的映射函數(shù)。函數(shù)式編程(FP)里很基礎的一個概念。
12、end(): 參見http://api.jquery.com/end 。這個是返回選擇器的上一個狀態(tài)。返回的是jQuery.prevObject屬性。這個屬性是在pushStack函數(shù)里面設置的,它在返回新的jQuery對象之前,把這個新對象的prevObject設置為this。這樣多次pushStack之后就變成了一個鏈表(chain)。而end()就是沿著鏈表往前走一個節(jié)點。經(jīng)過了selector之后,根的prevObject是document。比如$("body div").prevObject就是Document。
extend函數(shù)
在jQuery基本成員之后,所有其他成員都是用extend加上去的。聲明:
jQuery.extend = jQuery.fn.extend = function() { }
把target后面的所有object參數(shù)的屬性全部賦值到target上,如果第一個參數(shù)是boolean值,則用來指定是否深拷貝。然后返回修改過的target(不是新對象,extend函數(shù)直接修改原對象)。

相關文章

最新評論