第二章 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>
相關文章
- 第二章 jQuery技術解密(一)jQuery解密
- 第二章 jQuery技術解密 (二)jQuery解密
- 第二章 jQuery技術解密 (四)jQuery解密
- 第二章 jQuery技術解密 (三)jQuery解密
- 第二章 jQuery技術解密 (五)jQuery解密
- 第二章 jQuery技術解密 (七)jQuery解密
- 騰訊萬億級 Elasticsearch 技術解密Elasticsearch解密
- ChatGPT軟體技術棧解密ChatGPT解密
- Oracle Flashback 技術大解密Oracle解密
- 精通struts技術第二章(4) (轉)
- 精通struts技術第二章(5) (轉)
- 解密數倉的SQL ON ANYWHERE技術解密SQL
- 社交軟體紅包技術解密(十二):解密抖音春節紅包背後的技術設計與實踐解密
- 有獎書評活動:《京東技術解密》解密
- 技術問答集錦(六)
- 第二章投資技術《第五節 背離》
- 讀《JavaScript核心技術開發解密》筆記JavaScript解密筆記
- 解密阿里巴巴安全技術體系解密阿里
- 【技術解密】SequoiaDB分散式儲存原理解密分散式
- [解密] DNA儲存技術究竟牛在哪裡?解密
- [原創]京東技術解密讀書筆記解密筆記
- jQuery第二章知識點jQuery
- jQuery第二章選擇器jQuery
- 讀《圖解密碼技術》(三):金鑰、隨機數和應用技術圖解解密密碼隨機
- 前端技術演進(六):前端專案與技術實踐前端
- 區塊鏈技術筆記六區塊鏈筆記
- 第二章投資技術《第三節 K線秘籍》
- vivo營銷自動化技術解密|開篇解密
- 解密|一文帶你看懂外掛技術解密
- jQuery第二章課後作業jQuery
- jQuery亂談(六)jQuery
- 大資料六大核心技術大資料
- 學習ASM技術(六)-- ASMCMD命令列ASM命令列
- 地球上最大的PHP站點後端技術解密PHP後端解密
- 解密阿里巴巴的技術發展路徑解密阿里
- 防禦網路威脅UTM技術解密(圖示)解密
- RxJava操作符系列六 | 掘金技術徵文RxJava
- “聲討”高雲的《jQuery技術內幕》jQuery