Zepto源碼筆記(二)

uniq(array)

返回不存在重複值的數組css

 

function classRE(name)

判斷classCache中是否已存在name,若存在則取出classCache[name];不然存入該類名的正則表達式至classCache[name]中html

 

function maybeAddPx(name,value)

若name在cssNumber中則返回value;不然返回value+"px"node

 

function defaultDisplay(nodeName)

從elementDisplay中獲取該nodeName(即標籤類名:a,div,p……)的默認display值;若elementDisplay中不存在nodeName該項,則新建該節點並添加到文檔中經過getComputedStyle(element, '').getPropertyValue("display")獲取其默認值,若默認爲none則設爲「block」並存入elementDisplay[nodeName]中正則表達式

ps:zepto中定義了getComputedStyle=document.defaultView.getComputedStyle數組

 

$.each(elements, callback)

若elements是類數組(elements.length 是 number類型),則用for(var i = 0,l=elements.length ; i < l ; i++)來加速循環調用callbackdom

若不是類數組,則使用for in來循環對每一個屬性調用callback函數

上述兩個循環中一旦callback返回值爲false即中斷循環優化

最後返回值均爲elementsthis

 

 

$.map(elements, callback)

map函數和each函數的優化策略是同樣的,只是map返回的是單一對象(elements.length <= 0)或一組數組(elements.length > 0),結果中存放遍歷函數的運行結果spa

 

zepto.Z(dom, selector)

將dom的原型設爲$.fn,以便返回值能調用$.fn的方法

 

zepto.isZ(object)

判斷object的原型是否zepto.Z(zepto.Z.prototype = $.fn)

 

zepto.init(selector,context)

進入下述其中一條分支,按順序依次判斷

a.若!selector則返回空的zepto collection,也就是zepto.Z()

b.若selector是函數則在DOMContentLoaded後執行

c.若selector已是Z對象,則返回selector自己

d.若非上述三種狀況,則進入下述其中一條分支,按順序依次判斷

    d1.若selector是Array,則dom=compact(selector)

    d2.若selector是對象:

            d21.若isPlainObject(selector)爲true,則dom爲selector的副本(淺複製)

            d22.若isPlainObject(selector)爲flase,則dom=selector

        令selector = null;

    d3.若selector符合fragmentRE(html片斷),則dom爲根據該片斷生成的節點,令selector = null

    d4.若存在context,則返回$(context).find(selector),也就是context中的selector節點,此時init函數已經結束

    d5.若非上述狀況,則dom=zepto.qsa(document, selector),也就是從document中查找符合selector的節點

    若符合d1,d2,d3,d5則返回zepto.Z(dom,selector)

 

zepto.fragment(html, name, properties)

對html進行拓展(若html爲"<div/>",則拆分閉合後爲"<div></div>")

若name沒定義,則經過正則表達式從html中獲取name

若name不在containers中,則name = 「*」

建立一個container,令其等於containers[name],並使其innerHTML=html;

dom = $.each(slice.call(container.childNodes), function(){
      container.removeChild(this)
    })

若是isPlainObject(properties)返回true,則另nodes=$(dom),並對nodes設置properties 這3行代碼不只使dom=slice.call(container.childNodes),還清空了container的內容,使container不受污染

最後,返回dom(此時dom是slice.call(container.childNodes), 並非z集合)

 

$ = function(selector, context){
    return zepto.init(selector, context)
  }

此處不直接使用$=zepto.init是由於要對$進行擴展而不會影響zepto.init

相關文章
相關標籤/搜索