第二章 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;
- };
相關文章
- 第二章 jQuery技術解密(一)jQuery解密
- 第二章 jQuery技術解密 (二)jQuery解密
- 第二章 jQuery技術解密 (四)jQuery解密
- 第二章 jQuery技術解密 (三)jQuery解密
- 第二章 jQuery技術解密 (六)jQuery解密
- 第二章 jQuery技術解密 (七)jQuery解密
- 第二章投資技術《第五節 背離》
- 《Web前端黑客技術解密》讀書筆記(第三、四、五章)Web前端黑客解密筆記
- 騰訊萬億級 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
- 區塊鏈技術筆記五區塊鏈筆記
- 地球上最大的PHP站點後端技術解密PHP後端解密
- 解密阿里巴巴的技術發展路徑解密阿里
- 防禦網路威脅UTM技術解密(圖示)解密
- 做技術的「五比一」原則
- (INTERBASE之五) IB技術指標 (轉)指標
- “聲討”高雲的《jQuery技術內幕》jQuery
- 個人練習前端技術使用Bootstrap、JQuery、thymeleaf前端bootjQuery