摘要:核心類似選擇器,選擇元素組成對(duì)象集合將字符串轉(zhuǎn)化成對(duì)象集合根據(jù)給定標(biāo)簽和屬性生成對(duì)象集合給定函數(shù),在頁(yè)面加載完成后觸發(fā)函數(shù)參數(shù)沒(méi)內(nèi)容,則返回空集合如果是標(biāo)簽,則生成元素先行檢查是否為開頭,提高正則檢測(cè)效率如果有,則生成的對(duì)象集合,再檢索以規(guī)
核心 $() / zepto.init()
類似 CSS 選擇器,選擇元素組成 zepto 對(duì)象集合
將 HTML 字符串轉(zhuǎn)化成 zepto 對(duì)象集合
根據(jù)給定標(biāo)簽和屬性生成 zepto 對(duì)象集合
給定函數(shù),在頁(yè)面加載完成后觸發(fā)函數(shù)
zepto.init = function(selector, context) { var dom // 參數(shù)沒(méi)內(nèi)容,則返回空集合 if (!selector) return zepto.Z() else if (typeof selector == "string") { selector = selector.trim() // 如果是 html 標(biāo)簽,則生成 dom 元素 // 先行檢查是否為 < 開頭,提高正則檢測(cè)效率 if (selector[0] == "<" && fragmentRE.test(selector)) dom = zepto.fragment(selector, RegExp.$1, context), selector = null // 如果有 context,則生成 context 的對(duì)象集合,再檢索 else if (context !== undefined) return $(context).find(selector) // 以 css 規(guī)則檢索元素 else dom = zepto.qsa(document, selector) } // 如果傳參是函數(shù),則在頁(yè)面加載完成時(shí)觸發(fā)執(zhí)行 else if (isFunction(selector)) return $(document).ready(selector) // 如果給定的是 zepto 集合,直接返回 else if (zepto.isZ(selector)) return selector else { // 是數(shù)組,則過(guò)濾 null 元素 if (isArray(selector)) dom = compact(selector) // 是對(duì)象,則包在數(shù)組中 else if (isObject(selector)) dom = [selector], selector = null // If it"s a html fragment, create nodes from it // 什么情況下邏輯會(huì)走到下面?此時(shí) html fragment 是什么?? else if (fragmentRE.test(selector)) dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null // If there"s a context, create a collection on that context first, and select // nodes from there else if (context !== undefined) return $(context).find(selector) // And last but no least, if it"s a CSS selector, use it to select nodes. else dom = zepto.qsa(document, selector) } // create a new Zepto collection from the nodes found return zepto.Z(dom, selector) }zepto.fragment
由給定的 html 字符串生成 DOM 元素
返回由 DOM 元素組成的數(shù)組
zepto.fragment = function(html, name, properties) { var dom, nodes, container // 判斷是否空標(biāo)簽,如: if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1)) if (!dom) { if (html.replace) html = html.replace(tagExpanderRE, "<$1>$2>") // 補(bǔ)全雙標(biāo)簽 if (name === undefined) name = fragmentRE.test(html) && RegExp.$1 if (!(name in containers)) name = "*" container = containers[name] container.innerHTML = "" + html // 使 html 字符串轉(zhuǎn)換成 dom 元素 // 將 container 內(nèi)的元素集合轉(zhuǎn)換成數(shù)組,賦值給dom,并清空 container // slice.call 兩個(gè)好處:1. 轉(zhuǎn)換成數(shù)組 2. 數(shù)組拷貝 // 這里為什么不直接將 container 置空,而是一個(gè)個(gè)移除呢?? dom = $.each(slice.call(container.childNodes), function(){ container.removeChild(this) }) } // properties 屬性賦值 if (isPlainObject(properties)) { nodes = $(dom) $.each(properties, function(key, value) { if (methodAttributes.indexOf(key) > -1) nodes[key](value) else nodes.attr(key, value) }) } return dom }zepto.qsa(element, selector)
zepto 下的元素選擇器
使用 querySelectorAll 和選項(xiàng)實(shí)現(xiàn)類似 css 選擇器,如“#id”
不直接用 querySelector 或 querySelectorAll,只為更好的性能
規(guī)則
selector 以 # 開頭,則用 getElementById
selector 以 . 開頭,則用 getElementsByClassName
isSimple=/^[/w-]*$/
isSimple & 非# & 非.,用 getElementsByTagName
非 Simple,用 querySelectorAll
zepto.Z生成 zepto 對(duì)象集合
zepto.Z = function(dom, selector) { return new Z(dom, selector) } function Z(dom, selector) { var i, len = dom ? dom.length : 0 for (i = 0; i < len; i++) this[i] = dom[i] this.length = len this.selector = selector || "" }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91999.html
摘要:本來(lái)想學(xué)習(xí)一下的源碼,但由于的源碼有多行,設(shè)計(jì)相當(dāng)復(fù)雜,所以決定從開始,分析一個(gè)成熟的框架的代碼結(jié)構(gòu)及執(zhí)行步驟。同時(shí)發(fā)表在我的博客源碼分析代碼結(jié)構(gòu) 本來(lái)想學(xué)習(xí)一下jQuery的源碼,但由于jQuery的源碼有10000多行,設(shè)計(jì)相當(dāng)復(fù)雜,所以決定從zepto開始,分析一個(gè)成熟的框架的代碼結(jié)構(gòu)及執(zhí)行步驟。 網(wǎng)上也有很多zepto的源碼分析,有的給源碼添加注釋,有的談與jQuery的不同,...
摘要:選擇的理由是一個(gè)用于現(xiàn)代瀏覽器的與大體兼容的庫(kù)。環(huán)境搭建分析環(huán)境的搭建僅需要一個(gè)常規(guī)頁(yè)面和原始代碼一個(gè)常規(guī)頁(yè)面打開的首頁(yè)即可,在開發(fā)人員工具中即可使用原始代碼本篇分析的代碼參照,進(jìn)入該代碼分支中即可。 選擇 Zepto 的理由 Zepto is a minimalist JavaScript library for modern browsers with a largely jQue...
摘要:源碼分析一核心代碼分析源碼分析二奇淫技巧總結(jié)本文只分析核心的部分代碼,并且在這部分代碼有刪減,但是不影響代碼的正常運(yùn)行。當(dāng)長(zhǎng)度為則不添加內(nèi)容,否則逐個(gè)將逐個(gè)到當(dāng)前實(shí)例新增直接返回一個(gè)新的構(gòu)造函數(shù)添加初始化方法。 Zepto源碼分析(一)核心代碼分析Zepto源碼分析(二)奇淫技巧總結(jié) 本文只分析核心的部分代碼,并且在這部分代碼有刪減,但是不影響代碼的正常運(yùn)行。 目錄 * 用閉包封裝Z...
摘要:在觸發(fā)事件前,先將保存定時(shí)器的變量釋放,如果對(duì)象中存在,則觸發(fā)事件,保存的是最后觸摸的時(shí)間。如果有觸發(fā)的定時(shí)器,清除定時(shí)器即可阻止事件的觸發(fā)。其實(shí)就是清除所有相關(guān)的定時(shí)器,最后將對(duì)象設(shè)置為。進(jìn)入時(shí),立刻清除定時(shí)器的執(zhí)行。 大家都知道,因?yàn)闅v史原因,移動(dòng)端上的點(diǎn)擊事件會(huì)有 300ms 左右的延遲,Zepto 的 touch 模塊解決的就是移動(dòng)端點(diǎn)擊延遲的問(wèn)題,同時(shí)也提供了滑動(dòng)的 swip...
摘要:輔助方法這個(gè)方法遞歸遍歷的子節(jié)點(diǎn),將節(jié)點(diǎn)交由回調(diào)函數(shù)處理。對(duì)集合進(jìn)行遍歷,調(diào)用方法,如果為函數(shù),則將回調(diào)函數(shù)返回的結(jié)果作為參數(shù)傳給否則,如果為,則將也即包裹元素的副本傳給,否則直接將傳給。 這篇依然是跟 dom 相關(guān)的方法,側(cè)重點(diǎn)是操作 dom 的方法。 讀Zepto源碼系列文章已經(jīng)放到了github上,歡迎star: reading-zepto 源碼版本 本文閱讀的源碼為 zepto...
摘要:源碼結(jié)構(gòu)整體結(jié)構(gòu)如果在編輯器中將的源碼折疊起來(lái),看到的就跟上面的代碼一樣。參考源碼分析代碼結(jié)構(gòu)對(duì)象思想與源碼分析設(shè)計(jì)和源碼分析源碼中關(guān)于的問(wèn)題最后,所有文章都會(huì)同步發(fā)送到微信公眾號(hào)上,歡迎關(guān)注歡迎提意見(jiàn) 雖然最近工作中沒(méi)有怎么用 zepto ,但是據(jù)說(shuō) zepto 的源碼比較簡(jiǎn)單,而且網(wǎng)上的資料也比較多,所以我就挑了 zepto 下手,希望能為以后閱讀其他框架的源碼打下基礎(chǔ)吧。 源碼版...
閱讀 2572·2023-04-25 20:05
閱讀 2896·2023-04-25 17:56
閱讀 2210·2021-10-14 09:49
閱讀 2696·2019-08-29 15:10
閱讀 2930·2019-08-29 12:25
閱讀 428·2019-08-28 18:23
閱讀 765·2019-08-26 13:26
閱讀 1381·2019-08-23 18:21