JS獲取子、父、兄節(jié)點方法小結
我們在實際的開發(fā)中,經常要獲取頁面中某個html元素,動態(tài)更新元素的樣式、內容屬性等。
我們已經知道在JavaScript中提供下面的方法獲取子、父、兄節(jié)點的方法:
常規(guī)
通過父節(jié)點獲取子節(jié)點:
parentObj.firstChild 獲取已知父節(jié)點的第一個子節(jié)點
parentObj.lastChild 獲取已知父節(jié)點的最后一個子節(jié)點
parentObj.childNodes 獲取已知父節(jié)點的子節(jié)點數組(這里我在IE 7中獲取的是所有直接的子節(jié)點)
parentObj.children 獲取已知節(jié)點的直接子節(jié)點數組(在IE7中和childNodes效果一樣)
parentObj.getElementsByTagName(tagName) 返回已知子節(jié)點中類型為指定值的子節(jié)點數組
通過臨近節(jié)點獲取兄弟節(jié)點:
neighbourNode.previousSibing 獲取已知節(jié)點的前一個兄弟節(jié)點
neighbourNode.nextSibing 獲取已知節(jié)點的下一個兄弟節(jié)點
通過子節(jié)點獲取父節(jié)點:
1、childNode.parentNode 獲取已知節(jié)點的父節(jié)點
上面的方法基本都是可以遞歸是使用的,parentObj.firstChild.firstChild.firstChild...但是這樣的代碼有一種傻傻的趕腳。。
擴展
在擴展之前,我們需要知道一些關于節(jié)點基礎的知識:Dom節(jié)點中,每個節(jié)點都擁有不同的類型
W3C規(guī)范中常用的Dom節(jié)點的類型有以下幾種
| 節(jié)點類型 | 說明 | 值 |
| 元素節(jié)點 | 每一個HTML標簽都是一個元素節(jié)點 | 1 |
| 屬性節(jié)點 | 元素節(jié)點(HTML標簽)的屬性,如id,class,name等 | 2 |
| 文本節(jié)點 | 元素節(jié)點或屬性節(jié)點中的文本內容 | 3 |
| 注釋節(jié)點 | 便是文檔的注釋,形式如<!--comment Text--> | 8 |
| 文檔節(jié)點 | 表示整個文檔(Dom樹的根節(jié)點,即document) | 9 |
關于節(jié)點的名稱,不同類型的節(jié)點對應不同的名稱
| 節(jié)點類型 | 節(jié)點名稱 |
| 元素節(jié)點 | HTML的名稱(大寫) |
| 屬性節(jié)點 | 屬性的名稱 |
| 文本節(jié)點 | 它的值永遠的都#text |
| 文檔節(jié)點 | 它的值永遠都是#document |
可以分別通過nodeType(節(jié)點類型),nodeName(節(jié)點名稱),以及nodeValue(節(jié)點值)分別返回節(jié)點的類型、節(jié)點名稱以及節(jié)點值(比如元素節(jié)點返回1,屬性節(jié)點返回2)
JS獲取兄弟節(jié)點的兩種方法
方法一:通過父元素的子元素先找到含自己在內的“兄弟元素”,然后在剔除自己
function sibling(elem){
var a = [];
var b = elem.parentNode.children;
for (var i = 0 ; i < b.length ; i++){
if(b[i] !== elem) a.push(b[i]);
}
return a;
}
方法二:jQuery中實現方法,先通過查找元素的第一個子元素,然后在不斷往下找下一個緊鄰元素,判斷并剔除自己。
siblings:function(elem)
{
return JQuery.sibling(elem.parentNode.firstNode,elem);
}
JQuery.sibling = function(n,elem){
var r = [];
for (;n;n= n.nextSibling){
if(n.nodeType == 1 && (!elem || elem != elem))
r.push(n);
}
return r;
}
在jQuery 1.2多的版本中都可以找到這段代碼,我看的jQuery1.2.3的版本,在1800行可以找到這段代碼:
把這個方法轉化為獨立可用的函數:
fucntion sibling(elem){
var r = [];
var n = elem.parentNode.firstChild;
for(;n;n = n.nextSibling) {
if(n.nodeType === 1 && n !== elem) {
r.push(n);
}
}
return r;
}
很顯然通過這種方法查找特定節(jié)點的兄弟元素,可以很方便的避免的使用遞歸的冗余。
獲取所有元素子節(jié)點
在JavaScript中,可以通過children來獲取所有的子節(jié)點(只返回HTML中,甚至不返回子節(jié)點),幾乎得到了所有瀏覽器的支持,但是在Firefox有的版本中不支持。
注意:在IE中,children包含注釋節(jié)點
所以因為特殊情況的存在,有時候我們需要只獲取元素節(jié)點,這樣我們就可以通過nodeType屬性來進行篩選,用上面的知識:nodeType == 1的節(jié)點為元素節(jié)點。
下面,自定義一個函數來獲取所有的元素子節(jié)點:
var getChildNodes = function(elem) {
var childArr = elem.children || elem.childNodes,
childArrTem = new Array();
for (var i = 0 ; i < childArr.length; i ++ ) {
if (childArr[i].nodeType == 1){
childArrTem.push(childArr[i]);
}
}
return childArrTem;
}
獲取所有的父節(jié)點
同樣的,我們可以獲取當前節(jié)點所有的父節(jié)點:
function getParents (elem){
var parents = [];
while(elem.parentNode){
parents.push(elem.parentNode)
elem = elem.parentNode;
}
return parents;
}
這樣我們可以接受一個dom節(jié)點,最終會獲取到document對象,如果只要獲取到最上層是body,可以把while里的判斷改為: while(elem.parentNode && elem.parentNode.tagName == 'BODY'
依據JavaScript中的提供的獲取節(jié)點的方法和相關的知識,我們可以寫出很多封裝的方法,嘗試一下,你可以寫出多少種獲取節(jié)點的方法呢?
當我們寫出了一些操作節(jié)點的封裝之后在去看jQuery中Dom操作節(jié)點方法的源碼會輕松很多呢。
總結
以上所述是小編給大家介紹的JS獲取子、父、兄節(jié)點方法小結,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

