第二章 jQuery技術解密 (五)
2.3.5 引用 DOM 元素
jQuery() 函式能夠直接接受 HTML 字串,並把它們轉換為 DOM 結構,這是上一節中所講解的利用 jQuery() 函式生成 DOM 元素。當然,我們也可以看到 jQuery() 函式還可以接收 DOM 元素、DOM元素集合、HTML標籤或者 ID 值。下面我們就來分析 jQuery.fn.init() 構造器是如何把這些型別的引數轉換為 DOM 元素的。
對於 HTML 標籤來說,它使用 document.getElementsByTagName() 方法獲取 DOM 元素集合。對於 ID 引數來說,它使用 document.getElementById() 方法獲取特定的 DOM 元素。另外,還可以使用 DOM 元素的 childNodes、firstChild、lastChild、nextSibling、parentNode 和 previousSibling 的屬性引用 DOM 節點。
既然說 DOM 元素能夠通過 lastChild、parentNode 等屬性引用節點,jQuery 物件又是 DOM 元素的集合,因此,jQuery 就可以考慮通過整合 DOM 元素的這些屬性來獲得其集合中所有元素各自引用的節點。把這些間接引用的節點組合起來又構成了新的 DOM 元素集合。下面我們就來分析 jQuery 是如何引用節點的。
- //通過each()方法為jQuery物件對映一組引用DOM節點的方法
- jQuery.each({
- parent:function(elem){returnelem.parentNode;},//引用父節點
- parents:function(elem){returnjQuery.dir(elem,"parentNode");},//引用所有父節點
- next:function(elem){returnjQuery.nth(elem,2,"nextSibling");},//引用相鄰的下一個DOM元素
- prev:function(elem){returnjQuery.nth(elem,2,"previousSibling");},//引用相鄰的上一個DOM元素
- nextAll:function(elem){returnjQuery.dir(elem,"nextSibling");},//引用所有後繼DOM元素
- prevAll:function(elem){returnjQuery.dir(elem,"previousSibling");},//引用所有前繼DOM元素
- sibling:function(elem){returnjQuery.sibling(elem.parentNode.firstChild,elem);},//引用相鄰DOM元素
- children:function(elem){returnjQuery.sibling(elem.firstChild);},//引用所有子元素
- //如果存在iframe,則就是文件,或者所有子節點
- //elem.contentDocument||elem.contentWindow.documentiframe的屬性
- //http://devoloper.mozilla.org/on/docs/XUL:iframe
- contents:function(elem){returnjQuery.nodeName(elem,"iframe")?elem.contentDocument||
- elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
- },function(name,fn){
- //為jQuery物件註冊同名方法
- jQuery.fn[name]=function(selector){
- //每個元素都執行同名方法
- varret=jQuery.map(this,fn);
- //過濾元素集
- if(selector&&typeofselector=="string")
- ret=jQuery.multiFilter(selector,ret);
- //返回構建的jQuery物件
- returnthis.pushStack(jQuery.unique(ret),name,selector);
- };
- });
- 對於父節點引用來說,可以引用當前 DOM 元素的父親節點,也可以獲得所有父級節點,包括祖先節點。
- 對於子節點引用來說,就是可以引用所有直接的子節點,但不包括不相鄰的後代節點。
- 對於兄弟節點引用來說,可以引用包括當前 DOM 元素的前或後相鄰節點,也包括前後相近的所有元素。
- //從一個元素出發,檢索某個方向上的所有元素
- //如可以把元素的parentNode、nextSibling、previousSibling、lastChild、firstChild屬性作為方向
- //引數說明:
- //elem參數列示起點元素
- //dir參數列示元素的方向屬性,如parentNode、nextSibling、previousSibling、lastChild、firstChild
- jQuery.dir=function(elem,dir){
- varmatched=[],cur=elem[dir];
- //逐級迭代訪問,直到訪問到document節點
- while(cur&&cur!=document){
- if(cur.nodeType==1)//Element型別
- matched.push(cur);
- cur=cur[dir];//向上一級傳遞節點
- }
- returnmatched;
- };
所以說,dir() 函式對於檢索 DOM 文件樹中呈放射線性排列的元素來說,是非常有用的。但是如果要檢索在某個方向上的第幾個元素,如檢索偶數序號位置的元素,就需要使用 nth() 函式。該函式的原始碼如下所示。
- //從一個元素出發,檢索某個方向上的第幾個元素。引數Result是第幾個
- //引數說明:
- //cur參數列示起點元素
- //dir參數列示元素的方向屬性,如parentNode、nextSibling、previousSibling、lastChild和firstChild
- //result參數列示級數,預設值為1
- //elem引數是一個無用引數
- jQuery.nth=function(cur,result,dir,elem){
- result=result||1;
- varnum=0;
- for(;cur;cur=cur[dir])
- if(cur.nodeType==1&&++num==result)
- break;
- returncur;
- };
jQuery.sibling() 函式就比較簡單,但是沒有上面兩個方法有用。它實現了從一個元素(包括自身)檢索所有後續相鄰元素,然後再從這個後續的相鄰元素排除一個指定元素。例如:
- //從包含引數n的元素開始檢索所有後續相鄰元素,但不包含引數elem指定的元素
- //引數說明:
- //n參數列示起點元素
- //elem引數排除元素
- jQuery.sibling=function(n,elem){
- varr=[];
- for(;n;n=n.nextSibling){
- if(n.nodeType==1&&n!=elem)
- r.push(n);
- }
- returnr;
- };
相關文章
- 第二章投資技術《第五節 背離》
- ChatGPT軟體技術棧解密ChatGPT解密
- 解密數倉的SQL ON ANYWHERE技術解密SQL
- 騰訊萬億級 Elasticsearch 技術解密Elasticsearch解密
- jQuery第二章知識點jQuery
- jQuery第二章選擇器jQuery
- 解密阿里巴巴安全技術體系解密阿里
- jQuery第二章課後作業jQuery
- 讀《JavaScript核心技術開發解密》筆記JavaScript解密筆記
- 社交軟體紅包技術解密(十二):解密抖音春節紅包背後的技術設計與實踐解密
- 解密|一文帶你看懂外掛技術解密
- vivo營銷自動化技術解密|開篇解密
- 雲原生五大技術
- 第二章投資技術《第三節 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前端
- jQuery入門(五)Ajax和jsonjQueryJSON
- 工作中常見的五種技術leader
- 解密國內BAT等大廠前端技術體系-完結篇解密BAT前端
- 宜人貸蜂巢API閘道器技術解密之Netty使用實踐API解密Netty
- IBM:未來五年改變人類生活的五項技術IBM
- Android技術棧(五)HashMap和ArrayMap原始碼解析AndroidHashMap原始碼
- DDFE 技術週刊(第五期)2016.12.5
- 工作五年後,做技術還是做管理?
- 五年了,我的技術管理成長之路
- PostgreSQL 技術內幕(五)Greenplum-Interconnect模組SQL
- 【PPT已更新】360網際網路技術訓練營第九期——360容器技術解密與實踐解密
- 來自Riot 的一份遊戲美術教程(五):技術美術遊戲
- jQuery第五章知識點jQuery
- 分散式資料庫企業級功能技術解密與最佳實踐分散式資料庫解密
- AI華人科學家張本宇解密螞蟻“共享智慧”技術AI解密
- 華為盤古大模型5.0技術解密:更多模態,複雜推理大模型解密