讀zepto核心源碼學習JS筆記(3)--zepto.init()

上篇已經講解了zepto.init()的幾種情況,這篇就繼續記錄這幾種情況下的具體分析.

1. 首先是第一種情況,selector為空

既然是反向分析,那我們先看看這句話的代碼;

if (!selector) return zepto.Z()

這里的返回值為zepto.Z();那我們繼續往上找zepto.Z()函數

zepto.Z = function(dom, selector) {return new Z(dom, selector)
}

這個函數仍然擁有一個返回值,Z函數的實例,同樣的道理,我們繼續去找Z() ;

function Z(dom, selector) {var i, len = dom ? dom.length : 0for (i = 0; i < len; i++) this[i] = dom[i]this.length = lenthis.selector = selector || ''
}

根據以上代碼可以分析出,當沒有參數時,會得到一個length:0,selector:''的對象.
1044766-20170713172250197-1275291817.png

2. 當selector為字符串的時候,又分為三種情況;

同樣的,我們先看看這句話的代碼

else if (typeof selector == 'string') {selector = selector.trim()
}
  • 第一種,當selector為html片段
if (selector[0] == '<' && fragmentRE.test(selector))dom = zepto.fragment(selector, RegExp.$1, context), selector = null

這里有兩個知識點:
1 fragmentRE.test(selector)

這里的fragmentRE是Zepto函數在之前定義的一段正則;
```java
//<div>erfwef</div>  取出<div>
fragmentRE = /^\s*<(\w+|!)[^>]*>/,
```

2 zepto.fragment(selector, RegExp.$1, context)
* RegExp.$1
RegExp.$1為RegExp的一個屬性,指的是與正則表達式匹配的第一個 子匹配(以括號為標志)字符串;
例子:
java var r= /^(\d{4})-(\d{1,2})-(\d{1,2})$/; r.exec('1985-10-15'); s1=RegExp.$1; s2=RegExp.$2; s3=RegExp.$3; alert(s1+" "+s2+" "+s3)//結果為1985 10 15
* zepto.fragment()函數

```java
//對應上面的代碼,這里第一個參數是selector,就是我們在寫代碼時的$('xxx')中的xxx,name為RegExp.$1,即正則匹配的第一個()里的東西,就是標簽元素,例如 div p  h1等,properties為執行環境.
zepto.fragment = function(html, name, properties) {var dom, nodes, container// singleTagRE仍為之前定義的變量,singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, 匹配值如下截圖//如html傳入值為<p></p>,匹配singleTagRE,則創建<p></p>,并調用$('<p></p>')if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))//如果不匹配if (!dom) {//這是一段修復代碼,將<div/>之類的不正常的代碼修復成<div></div>;具體的下面再講解if (html.replace) html = html.replace(tagExpanderRE, "<$1></$2>")//如果沒有標簽名,,給他一個標簽,fragmentRE = /^\s*<(\w+|!)[^>]*>/,if (name === undefined) name = fragmentRE.test(html) && RegExp.$1//containers = {tr': document.createElement('tbody'),tbody': table, 'thead': table, 'tfoot': table,td': tableRow, 'th': tableRow,'*': document.createElement('div')},//如果name值不在container范圍內,則標簽名為divif (!(name in containers)) name = '*'//創建容器container = containers[name]//把html片段放入到容器中container.innerHTML = '' + html//這里調用了$.each();一會再詳細講解,這里是涉及到哪個函數我就去解析哪個函數,雖然看起來比較亂,但是符合我自己的邏輯線路.//emptyArray = [], slice = emptyArray.slice,所以這里的slice.call即為Array.prototype.slice.call(),能將具有length屬性的對象轉成數組;dom = $.each(slice.call(container.childNodes), function(){//刪除container.removeChild(this)})}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

}
```

以上代碼出現了singleTagRE

  • singleTagRE

1044766-20170713172311400-1100116137.png

  • tagExpanderRE

1044766-20170713172323197-1256822567.png

  • fragmentRE

1044766-20170713172335072-388797673.png

  • 第二種 當context有值
 else if (context !== undefined) return $(context).find(selector)

這里涉及到一個方法find,是$.fn中的方法,之后做統一分析;

  • 第三種 selector為普通選擇器
 else dom = zepto.qsa(document, selector)
    zepto.qsa = function(element, selector){var found,//判斷是不是IDmaybeID = selector[0] == '#',//判斷是不是cssmaybeClass = !maybeID && selector[0] == '.',//看是不是class和id名,如果是,將'#'或者'.'去除,然后賦值給nameOnlt;//否則,直接將值賦值;nameOnly = maybeID || maybeClass ? selector.slice(1) : selector,//simpleSelectorRE = /^[\w-]*$/,//匹配字母數字下劃線和減號的組合;isSimple = simpleSelectorRE.test(nameOnly)//如果有內置getElementById方法,并且是id名;return (element.getElementById && isSimple && maybeID) ?//則返回element.getElementByID(nameOnly)( (found = element.getElementById(nameOnly)) ? [found] : [] ) ://反之的話,再做一次判斷//若element不為元素節點,document,DocumentFragment時;為空,(element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] ://否則,將節點轉換成數組;slice.call(//這里是一個三元運算符里套著另一個三元運算符;isSimple && !maybeID && element.getElementsByClassName ?//當為class,則調用element.getElementsByClassName(nameOnly) maybeClass ? element.getElementsByClassName(nameOnly) ://否則調用tagName;element.getElementsByTagName(selector) ://這個否則是最外層的判斷;element.querySelectorAll(selector))}

3. 當傳入的值為函數時,則在dom加載后執行它;

else if (isFunction(selector)) return $(document).ready(selector)

4. 如果selector為Z的實例對象.則返回他自己;

else if (zepto.isZ(selector)) return selector

5. 最后,又分為5種情況;

  • 如果selector為數組;
    java // if (isArray(selector)) dom = compact(selector)
    這里用到了一個compact方法;
    java //這里調用了一個filter方法,是在$.fn內,以后統一分析; //這個函數是去除數組中的null和undefined; function compact(array) { return filter.call(array, function(item){ return item != null }) }
    所以當為數組的時候,去除數組中的null和undefined;

  • selector為對象
    java else if (isObject(selector)) dom = [selector], selector = null
    如果selector為對象,將對象變為一個數組;
  • selector為html片段;則將其轉換成dom
    java else if (fragmentRE.test(selector)) dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null
  • 有context的時候

    else if (context !== undefined) return $(context).find(selector)
  • 沒有context
    java else dom = zepto.qsa(document, selector)

轉載于:https://www.cnblogs.com/siva-epoch/p/7161627.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392066.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392066.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css flexbox模型_Flexbox和CSS Grid之間的主要區別

css flexbox模型by Shaira Williams由莎拉威廉姆斯(Shaira Williams) Flexbox和CSS Grid之間的主要區別 (The main differences between Flexbox and CSS Grid) Dimensions define the primary demarcation between Flexbox and CSS Grid. Flexbox was designed specifically …

置信區間估計 預測區間估計_估計,預測和預測

置信區間估計 預測區間估計Estimation implies finding the optimal parameter using historical data whereas prediction uses the data to compute the random value of the unseen data.估計意味著使用歷史數據找到最佳參數&#xff0c;而預測則使用該數據來計算未見數據的…

鴻蒙系統還會推出嗎,華為明年所有自研設備都升級鴻蒙系統,還會推出基于鴻蒙系統的新機...

不負期許&#xff0c;華為鴻蒙OS手機版如期而至。今日(12月15日)&#xff0c;鴻蒙OS 2.0手機開發者Beta版本正式上線&#xff0c;支持運行安卓應用&#xff0c;P40、Mate 30系列可申請公測。國內媒體報道稱&#xff0c;華為消費者業務軟件部副總裁楊海松表示&#xff0c;按照目…

C#中將DLL文件打包到EXE文件

1&#xff1a;在工程目錄增加dll目錄&#xff0c;然后將dll文件復制到此目錄&#xff0c;例如&#xff1a; 2&#xff1a;增加引用&#xff0c;定位到工程的dll目錄&#xff0c;選中要增加的dll文件 3&#xff1a;修改dll文件夾下面的dll文件屬性 選中嵌入式資源&#xff0c;不…

PopupMenu控件的使用

1、用PopupMenu控件能進行右鍵菜單的實現&#xff0c;它的實現還需要綁定到barManager控件上&#xff0c;在barManager的Customize中添加右鍵所需要顯示的功能。 2、PopupMenu屬性欄中綁定Manager為barManager&#xff1b; 3、窗體加載事件中創建 this.popupMenu1.AddItems(new…

Java—動態代理

動態代理利用了JDK API&#xff0c;動態地在內存中構建代理對象&#xff0c;從而實現對目標對象的代理功能。動態代理又被稱為JDK代理或接口代理。 靜態代理與動態代理的區別主要在&#xff1a; 靜態代理在編譯時就已經實現&#xff0c;編譯完成后代理類是一個實際的class文件…

Oracle VM Virtual Box的安裝

安裝Oracle VM Virtual Box安裝擴展插件 選擇"管理"?"全局設定" 在設置對話框中&#xff0c;選擇"擴展" 選擇"添加包" 找到"Oracle_VM_VirtualBox_Extension_Pack-4.1.18-78361"&#xff0c;點擊"打開" 5&#x…

python 移動平均線_Python中的SMA(短期移動平均線)

python 移動平均線With the evolution of technology rapidly evolving, so do strategies in the stock market. In this post, I’ll go over how I created a SMA(Short Moving Average) strategy.隨著技術的飛速發展&#xff0c;股票市場的策略也在不斷發展。 在本文中&…

angular中的href=unsafe:我該怎么擺脫你的溺愛!!

解決方法&#xff1a;angular.module加入下面這行&#xff1a;&#xff08;依據Angular changes urls to “unsafe:” in extension page&#xff09; .config(function($compileProvider){//注:有些版本的angularjs為$compileProvider.urlSanitizationWhitelist(/^\s*(https?…

android view gesturedetector,如何在Android中利用 GestureDetector進行手勢檢測

如何在Android中利用 GestureDetector進行手勢檢測發布時間&#xff1a;2020-11-26 16:15:21來源&#xff1a;億速云閱讀&#xff1a;92作者&#xff1a;Leah今天就跟大家聊聊有關如何在Android中利用 GestureDetector進行手勢檢測&#xff0c;可能很多人都不太了解&#xff0c…

Ubuntu2204配置samba

0.前情說明 samba服務器主要是用來局域網共享文件的&#xff0c;如果想公網共享可能行不通&#xff0c;我已經踩坑一天了 所以說如果你想滿足公網samba共享你就可以不要看下去了 1.參考連接 Ubuntu 安裝 Samba 服務器_ubuntu安裝samba服務器-CSDN博客 2.安裝samba服務 sud…

Java—BIO模型

利用 BIO 模型&#xff08;傳統阻塞 IO 模型&#xff09;實現多用戶訪問 源代碼 Server類 public class server {public static void main(String[] args) {ExecutorService executorService Executors.newFixedThreadPool(6);try {ServerSocket serverSocketnew ServerSocke…

c++學編程如何鍛煉耐力_我如何學習編程:這是一項耐力運動

c學編程如何鍛煉耐力by Amy M Haddad通過艾米M哈達德(Amy M Haddad) 我如何學習編程&#xff1a;這是一項耐力運動 (How I’m learning to program: it’s an endurance sport) 為什么我的編程學習軌跡反映了我作為跑步者的訓練方式 (Why my learning trajectory for programm…

python處理文本數據

處理文本數據&#xff0c;主要是通過Seris的str訪問。遇到NaN時不做任何處理&#xff0c;保留結果為NaN&#xff0c;遇到數字全部處理為NaN。 str是Seris的方法&#xff0c;DataFrame不能直接使用&#xff0c;但是通過索引選擇DataFrame中的某一行或者某一列&#xff0c;結果為…

Java系列筆記(4) - JVM監控與調優【轉】

Java系列筆記(4) - JVM監控與調優【轉】 目錄 參數設置收集器搭配啟動內存分配監控工具和方法調優方法調優實例 光說不練假把式&#xff0c;學習Java GC機制的目的是為了實用&#xff0c;也就是為了在JVM出現問題時分析原因并解決之。通過學習&#xff0c;我覺得JVM監控與調…

Maven打包排除某個資源或者目錄

最近在spark streaming本地調試的時候&#xff0c;引入了一些資源文件&#xff0c;打包的時候需要給排除掉。所以就考慮使用maven的方式 詳細參考官方文檔&#xff1a;https://maven.apache.org/plugins/maven-jar-plugin/examples/include-exclude.html 排除某個資源文件 <…

android發送網絡請求沒反應,Android無法使用HttpURLConnection發送GET請求

我正在嘗試在我的應用程序中使用HttpURLConnection.我將我的請求方法設置為’GET’,但是當我嘗試檢索輸出流時,該方法將更改為’POST’&#xff01;我不確定是什么原因,但是當我使用’POST’發送請求時,我的JSON服務器(我使用JAX-RS)會返回一個空白頁面.這是我的代碼片段&#…

地圖 c-suite_C-Suite的模型

地圖 c-suiteWe’ve all seen a great picture capture an audience of stakeholders.我們所有人都看到了吸引利益相關者聽眾的美好畫面。 Let’s just all notice that the lady in the front right is not captivated by the image on the board (Photo by Christina wocin…

框架和庫的區別_框架和庫之間的區別

框架和庫的區別Developers often use the terms “library” and “framework” interchangeably. But there is a difference.開發人員經常互換使用術語“庫”和“框架”。 但是有區別。 Both frameworks and libraries are code written by someone else that is used to he…

Java—多線程實現生產者消費者模型

采用線程實現“生產者-消費者”編程的基礎模型 源代碼 消費者代碼&#xff1a; public class Consumer implements Runnable {BlockingQueue<Integer> blockingQueue;int n;CountDownLatch countDownLatch;public Consumer(BlockingQueue<Integer> blockingQueue…