DOM節點操作
1. 節點概述
節點的三個基本屬性:
- 節點型別nodeType
- 節點名稱nodeName
- 節點值nodeValue
- 元素節點 nodeType為1(實際開發中的主要操作)
- 屬性節點 nodeType為2
- 文本節點 nodeType為3(文本節點包含文字、空格、換行等)
2. 節點層級
利用DOM樹可以把節點劃分為不同的層級關系,常見的是父子兄層級關系,
2.1 父級節點
node.parentNode
- parentNode屬性可以回傳某節點的最近一個父節點
- 如果指定的節點沒有父節點,則回傳nill
2.2 子節點
1.parentNode.childNodes // 標準
parentNode.childNode回傳包含指定節點的子節點的集合,該集合為即時更新的集合,
注:
- 回傳值里包含了所有的節點,包括元素節點、文本節點等
- 如果只想獲得里面的元素節點,則需要專門處理,所以這種情況下不建議使用childNodes
// 只想獲得里面的元素節點的處理
var eg = document.querySelector('ol');
for(var i = 0;i < ol.childNodes.length;i++) {
if (ol.childNodes[i].nodeType == 1) {
// 這樣就可以選出元素節點
......
}
}
2.parentNode.children // 非標準
parentNode.children是一個只讀屬性,回傳所有的子元素節點,它只回傳子元素節點,雖然它是非標準,但是得到了各個瀏覽器的支持,因而可以放心使用,
3.parentNode.firstChild
parentNode.firstChild回傳第一個子節點,找不到回傳null,回傳值里包含了所有的節點,包括元素節點、文本節點等,
4.parentNode.lastChild
parentNode.lastChild回傳最后一個節點,找不到回傳null,回傳值里包含了所有的節點,包括元素節點、文本節點等,
5.parentNode.firstElementChild
parentNode.firstElementChild回傳第一個子元素節點,找不到回傳null,
6.parentNode.lastElementChild
parentNode.lastElementChild回傳最后一個子元素節點,找不到回傳null,
注:5、6方法存在兼容性問題,ie9以上才支持,
由于firstChild和lastChild包含其他節點,而firstElementChild和lastElementChild又有兼容性問題,所以獲取第一個子元素節點或最后一個子元素節點的解決方法為:
- 如果想要第一個子元素節點,可以使用parentNode.children[0]
- 如果想要最后一個子元素節點,可以使用parentNode.children[parentNode.children.length-1]
2.3 兄弟節點
1.node.nextSibling
nextSibling回傳當前元素的下一個兄弟節點,找不到回傳null,回傳值里包含了所有的節點,包括元素節點、文本節點等,
2.node.previousSibling
previousSibling回傳當前元素上一個兄弟節點,找不到回傳null,回傳值里包含了所有的節點,包括元素節點、文本節點等,
3.node.nextElementSibling
nextElementSibling回傳當前元素下一個兄弟元素節點,找不到回傳null,
4.node.previousElementSibling
previousElementSibling回傳當前元素上一個兄弟元素節點,找不到回傳null,
注:方法3、4存在兼容性問題,ie9以上才支持,
解決兼容性問題的方法:
function getNextElemrntSibling(element) {
var el = element;
while (el = el.nextSibling) {
// 元素節點nodeType為1
if (el.nodeType === 1) {
return el;
}
}
return null;
}
3. 創建節點
document.createElement('tagName');
該方法創建由tagName指定的HTML元素,因為這些元素原先不存在,是根據我們的需求動態生成的,所以這種方法也稱為動態創建元素節點,
4. 添加節點
1.node.appendChild(child)
該方法將一個節點添加到指定父節點的子節點串列末尾,類似于css里的after偽元素,
2.node.insertBefore(child, 指定元素) // 指定元素為parentNode.children[x]
該方法將一個節點添加到父節點的指定子節點前面,類似于css里的before偽元素,
5. 洗掉節點
node.removeChild(child)
該方法從DOM中洗掉一個子節點,回傳洗掉的節點,
6. 復制節點(克隆節點)
node.cloneNode()
該方法回傳呼叫該方法的節點的一個副本,
注:
- 如果括號引數為慷訓者false,則是淺拷貝,只克隆復制節點本身,不克隆里面的子節點,
- 如果括號引數為true,則為深度拷貝,會復制節點本身以及里面所有的子節點,
7. 三種動態創建元素的區別
- document.write()
- element.innerHTML()
- document.createElement()
區別:
- document.write()是直接將內容寫入頁面的內容流,但是檔案流執行完畢,則它會導致頁面重繪,
- element.innerHTML()是將內容寫入某個DOM節點,不會導致頁面全部重繪,它創建多個元素時效率更高(不要拼接字串,采取陣列形式拼接),結構稍微復雜,
- document,createElement()創建多個元素效率稍低一點點,但是結構更清晰,
總結:不同瀏覽器下,innerHTML效率要比createElement高,
對于element.innerHTML()的使用:
// 1.拼接字串的方法,這種方法會使創建元素時效率降低,不要使用
var eg = document.querySelector('.inner');
for (var i = 0; i <= 100; i++) {
eg.innerHTML += '<div>例子</div>';
}
// 2.陣列形式拼接
var arr = [];
for (var i = 0; i <= 100; i++) {
arr.push('<div></div>');
}
eg.innerHTML = arr.join(''); // join()方法用于把陣列中的所有元素放入一個字串
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/205870.html
標籤:其他
上一篇:DOM節點操作
下一篇:如何防止多執行緒訪問
