第二章 jQuery技術解密 (六)
2.4 解析 jQuery 選擇器引擎 Sizzle
jQuery 從 1.3 版本開始,使用了新的選擇器引擎 Sizzle(官方網址 http://sizzlejs.com) 。Sizzle 是 jQuery 作者 John Resig 開發的 DOM 選擇器引擎 (Dom Selector Engine),速度號稱業界第一。而且它有一個重要的特點就是 Sizzle 是完全獨立於 jQuery 的,如果使用者不想用 jQuery ,還可以只用 Sizzle 。
Sizzle 選擇器引擎目前成為 jQuery 框架預設的選擇器引擎,相比原來的 jQuery 引擎,速度有很大的提升,如圖 2.3 所示的各種選擇器執行效率的對比。
2.4.1 回顧CSS的選擇器
在解析 jQuery 選擇器引擎 Sizzle 之前,我們不妨回顧一下 CSS 的選擇器 (CSS selector) 。CSS選擇器可以分為三種基本型別:ID選擇器 (#id)、Class選擇器(.class)和型別(type)選擇器(p)。
另外,CSS還支援高階選擇器,如屬性選擇器 (attribute)、偽類或偽物件選擇器 (Pseudo Classes) 等。這些都是單一的選擇器,可以在應用中把它們組合起來,形成組合選擇器,如 div#id,div:last-child。組合型選擇器又包括多種關係形式,如包含關係、並列關係、相鄰關係和父子關係等。
2.4.2 解析 jQuery 選擇器引擎的設計思路
儘管 jQuery 選擇器引擎 Sizzle 非常複雜,功能也非常強大,但是它們都是建立在 JavaScript 已定義的方法或屬性基礎上來實現的。這主要包括元素的 getElementsByTagName() 和 getElementById() 方法,以及元素的 childNodes、firstChild、lastChild、nextSibling、parentNode 和 previousSibling 屬性。藉助這些方法和屬性可以直接或間接地選擇相匹配的 DOM 元素。
為了方便講解,我們結合一個選擇器進行說明。選擇器程式碼如下所示。
$("div.red");
這是一個複合選擇器,一搬讀者可以這樣分析:在DOM文件樹中找到 class 屬性等於 "red" 的 div 元素。即一步到位,直接從DOM文件樹中選擇所需要的元素。實際上,如果根據選擇器引擎的工作方式,可以把這個字串拆分成兩步走。
- 第一步,根據 document.getElementsByTagName() 方法選擇文件樹中的 div 元素集合。
- 第二步,根據其 class 是否等於 "red" 進行判斷,把不等於該值的元素從結果集中去掉。
- 第一步,根據 document.getElementsByTagName() 方法選擇文件樹中的 div 元素集合。
- 第二步,迭代 div 元素集合,在所有的 div 元素中查詢每個 div 元素下的 p 元素。
- 第三步,合併結果。
- 第一步,根據 document.getElementsByTagName() 方法選擇文件樹中的 p 元素集合。
- 第二步,迭代 p 元素集合,在所有的 p 元素中查詢每個 p 元素的父級元素。
- 第三步,檢測父級元素。如果不是 div 元素,則遍歷上一級元素;如果迭代到文件樹的頂層,則排除該 p 元素;如果是 div 元素,則儲存該 p 元素。
2.4.3 選擇器和過濾器
- 第一類,選擇器 (selector) 。即根據給定的選擇符,從 DOM 文件樹找到相關的元素節點,並儲存到結果集中。
- 第二類,過濾器 (filter) 。根據表示式的條件,在結果集中過濾元素。
- 如果它們在 selector 字串的起始位置,那麼它們也可以完成選擇功能。例如 $("#id");、$(".class");。
- 如果它們不在起始位置,那麼就應該作為篩選器實現。例如 $("div#id"); 、$("div.class"); 。
2.4.4 Sizzle 引擎結構
- <scripttype="text/javascript">
- /*!
- *SizzleCSSSelectorEngine-v0.9.3
- *Copyright2009,TheDojoFoundation
- *ReleasedundertheMIT,BSD,andGPLLicenses.
- *Moreinformation:http://sizzlejs.com/
- */
- //把Sizzle引擎封裝在一個獨立的空間中
- (function(){
- //定義用於塊識別器的正規表示式
- varchunker=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^>+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
- done=0,
- toString=Object.prototype.toString;
- //Sizzle選擇器引擎構造器函式
- //引數說明:
- //selector:選擇器字串
- //context:上下文
- //results:結果集
- //seed:種子
- varSizzle=function(selector,context,results,seed){
- //省略的函式體
- };
- //Sizzle匹配函式
- //引數說明:
- //expr:匹配表示式
- //set:條件設定選項
- Sizzle.matches=function(expr,set){
- returnSizzle(expr,null,null,set);
- };
- //Sizzle查詢函式
- //引數說明:
- //expr:查詢表示式
- //context:上下文
- //isXML:檢測函式
- Sizzle.find=function(expr,context,isXML){
- //省略的函式體
- };
- //Sizzle過濾函式
- //引數說明:
- //expr:過濾表示式
- //set:條件設定選項
- //inplace:包含項
- //not:排除項
- Sizzle.filter=function(expr,set,inplace,not){
- //省略的函式體
- };
- //Sizzle表示式物件
- //列舉所用的各種匹配表示式
- varExpr=Sizzle.selectors={
- //省略成員屬性
- };
- //省略其他輔助性工具函式和邏輯程式碼暴露的介面
- jQuery.find=Sizzle;
- jQuery.filter=Sizzle.filter;
- jQuery.expr=Sizzle.selectors;
- jQuery.expr[":"]=jQuery.expr.filters;
- //定義的公共函式
- Sizzle.selectors.filters.hidden=function(elem){};
- Sizzle.selectors.filters.visible=function(elem){};
- Sizzle.selectors.filters.animated=function(elem){};
- jQuery.multiFilter=function(expr,elems,not){};
- jQuery.dir=function(elem,dir){};
- jQuery.nth=function(cur,result,dir,elem){};
- jQuery.sibling=function(n,elem){};
- return;
- window.Sizzle=Sizzle;
- })();
- </script>
相關文章
- ChatGPT軟體技術棧解密ChatGPT解密
- 解密數倉的SQL ON ANYWHERE技術解密SQL
- 騰訊萬億級 Elasticsearch 技術解密Elasticsearch解密
- jQuery第二章知識點jQuery
- jQuery第二章選擇器jQuery
- 解密阿里巴巴安全技術體系解密阿里
- jQuery第二章課後作業jQuery
- jQuery亂談(六)jQuery
- 讀《JavaScript核心技術開發解密》筆記JavaScript解密筆記
- 第二章投資技術《第五節 背離》
- 社交軟體紅包技術解密(十二):解密抖音春節紅包背後的技術設計與實踐解密
- 前端技術演進(六):前端專案與技術實踐前端
- 解密|一文帶你看懂外掛技術解密
- vivo營銷自動化技術解密|開篇解密
- jQuery入門(六)jQuery實現瀑布分頁jQuery
- 第二章投資技術《第三節 K線秘籍》
- Python技術分享:教你如何解密隔壁WiFi密碼Python解密WiFi密碼
- web專案技術必備-------jQuery快速入門WebjQuery
- 個人練習前端技術使用Bootstrap、JQuery、thymeleaf前端bootjQuery
- 大資料六大核心技術大資料
- 解密負載均衡技術和負載均衡演算法解密負載演算法
- 技術解密Java Chassis 3超實用的可觀測性解密Java
- 解密方舟的高效能記憶體回收技術——HPP GC解密記憶體GC
- OceanBase-【OBCP】認證-第二章 OB 儲存引擎高階技術儲存引擎
- 全面解密QQ紅包技術方案:架構、技術實現、移動端優化、創新玩法等解密架構優化
- 解密阿里巴巴大廠裡的web前端技術體系,技術不斷迭代,我們如何突破?解密阿里Web前端
- 六種實現負載均衡技術的方式負載
- 2024.10.29 人工智慧技術學 第六課時人工智慧
- Elasticsearch技術解析與實戰(六)Elasticsearch併發Elasticsearch
- 2022 年開源技術六大趨勢
- 一個阿里技術男經歷的六年“雙11”:技術改變阿里阿里
- 解密國內BAT等大廠前端技術體系-完結篇解密BAT前端
- 宜人貸蜂巢API閘道器技術解密之Netty使用實踐API解密Netty
- 阿里雲技術專家解讀:2021 年六大容器技術發展趨勢阿里
- 《阿里雲前端技術週刊》第六期阿里前端
- jQuery第六章知識點jQuery
- jQuery 原始碼學習 (六) 選擇器jQuery原始碼
- 前端基礎入門六(JQuery進階)前端jQuery
- 【PPT已更新】360網際網路技術訓練營第九期——360容器技術解密與實踐解密