zepto.init()函數裏有幾個很是重要的函數,zepto.fragment()函數是其中之一。它主要是對生成元素的一個處理,並對生成的dom元素進行返回。例如:$("<p>")或者爲他添加屬性$("<p>",{height:200px}),就會生成一個新的P元素出來。源碼以下:html
1 zepto.fragment = function(html, name, properties) { 2 // 內部函數 HTML 轉換成 DOM 3 // 原理是 建立父元素,innerHTML轉換 4 // @param html html片斷 5 // @param name 容器標籤名 6 // @param propertie 附加的屬性對象 7 // @returns {*} 8 var dom, nodes, container 9 10 // A special case optimization for a single tag 11 //若是是傳入單個元素,建立dom 12 if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1)) 13 14 if (!dom) { 15 //修正自閉合標籤 如<div />,轉換成<div></div> 16 if (html.replace) html = html.replace(tagExpanderRE, "<$1></$2>") 17 //給name取元素名 18 if (name === undefined) name = fragmentRE.test(html) && RegExp.$1 19 //設置容器名,若是不是tr,tbody,thead,tfoot,td,th,則容器名爲div 20 //爲何設置容器,是嚴格按照HTML語法,雖然tr td th瀏覽器會會自動添加tbody 21 if (!(name in containers)) name = '*' 22 //建立容器 23 container = containers[name] 24 //生成dom 25 container.innerHTML = '' + html 26 dom = $.each(slice.call(container.childNodes), function(){ 27 container.removeChild(this) 28 }) 29 } 30 31 if (isPlainObject(properties)) { 32 nodes = $(dom) 33 $.each(properties, function(key, value) { 34 if (methodAttributes.indexOf(key) > -1) nodes[key](value) 35 else nodes.attr(key, value) 36 }) 37 } 38 39 return dom 40 }
函數最上定義了幾個變量,而後是這樣一段代碼:node
//若是是傳入單個元素,建立dom if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))
· singleTagRE是咱們zepto函數中一開始就定義的一個正則表達式,用於探測單個元素,解釋以下:正則表達式
1 //用來匹配取出單個元素 2 // var singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/; 3 // var name = (singleTagRE.test("<p></p>")&&RegExp.$1); //這裏能夠正常匹配<p>,<p/>,<p></p> 4 // console.log(name); 5 // 結果:p 6 singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
· container是先前定義的一個對象,代碼以下,用於判斷元素的容器:瀏覽器
1 containers = { 2 'tr': document.createElement('tbody'), 3 'tbody': table, 'thead': table, 'tfoot': table, 4 'td': tableRow, 'th': tableRow, 5 '*': document.createElement('div') 6 },
· isPlainObject是用於判斷傳入參數obj是否爲純粹的對象(喲個對象字面量{}建立的或者new出來的對象),在這裏的用途是爲了判斷元素是否須要添加屬性,例如這樣:dom
$("<p>",{width:200px,height:200px;})中的第二個參數對象。函數
1 function isPlainObject(obj) { 2 return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype 3 }