Node接口定義了對應不一樣節點類型的12個常量(它們會在nodeType特性中使用到),IE中沒有定義這些常量,不過咱們能夠本身定義。node
if (typeof Node == undefined) { Node = { ELEMENT_NODE : 1, ATTRIBUTE_NODE : 2, TEXT_NODE : 3, CDATA_SECTION_NODE : 4, ENTITY_REFERENCE_NODE : 5, ENTITY_NODE : 6, PROCESSING_INSTRUCTION_NODE : 7, COMMENT_NODE : 8, DOCUMENT_NODE : 9, DOCUMENT_TYPE_NODE : 10, DOCUMENT_FRAGMENT_NODE : 11, NOTATION_NODE : 12 }; }
經常使用的Node特性介紹(中括號裏是其類型):app
在childNodes集合中有一個length屬性能夠用來顯示子節點的個數,好比頁面上有以下元素:spa
<div id="box-number"> <p>one</p> <p>two</p> <p>three</p> </div>
下面代碼是獲取上面div中子節點的個數:code
var boxNum = document.getElementById('box-number'); alert(boxNum.childNodes.length); // 輸出3
經常使用的Node方法介紹(中括號裏是其返回類型):對象
注意在使用appendChild(node)方法時,若是node已經在childNodes當中時,並不會再次添加node節點,而只是將node節點移到childNodes的末尾。blog
var boxNum = document.getElementById('box-number'), pOne = boxNum.childNodes[0]; boxNum.appendChild(pOne); // 最後會顯示<p>two</p><p>three</p><p>one</p>
DOM中定義了四個元素方法來操做元素的特性:接口
例如獲取上面div中的id特性:three
alert(boxNum.getAttribute('id')); // 輸出box-number
DOM中經常使用到的建立節點的方法包括:rem
好比要在上面的id爲box-number的div中的末尾添加一個新元素<p>four</p>:文檔
var pFour = document.createElement('p'), text = document.createTextNode('four'); pFour.appendChild(text); boxNum.appendChild(pFour);
移除節點、替換節點和在某節點前插入節點:
boxNum.removeChild(pOne); // 移除節點<p>one</p> var pFive = document.createElement('p'), text = document.createTextNode('five'); pFive.appendChild(text); boxNum.replaceChild(pFive, pFour); // 將節點<p>four</p>替換成<p>five</p> boxNum.insertBefore(pFour, pFive); // 在節點<p>five</p>前添加節點<p>four</p>
利用appendChild方法和insertBefore方法能夠實現insertAfter方法:
/** * 在某個節點後插入一個新節點 * * @param Node newNode 要插入的新節點 * @param Node ref DOM中已經存在的節點 * @return Node */ function insertAfter(newNode, ref) { ref.nextSibling ? ref.parentNode.insertBefore(newNode, ref.nextSibling) : ref.parentNode.appendChild(newNode); }
在進行添加節點操做時,第添加一個節點,頁面就會更新並反映出這個變化。對於少許的更新,這是很好的,然而,當要向DOM中添加大量數據時,若是逐個進行添加,這個過程就會十分緩慢。爲此,能夠建立一個文檔碎片,把全部的新節點附加在其上,而後一次性地將文檔碎片添加到DOM中。
var nameList = ['cctv', 'asdf', 'keal', 'jack', 'rose'], i, ii = nameList.length, nameP, text; for (i = 0; i < ii; i++) { nameP = document.createElement('p'); text = document.createTextNode(nameList[i]); nameP.appendChild(text); document.body.appendChild(nameP); }
上面這段代碼雖然運行良好,但它調用了5次document.body.appendChild()方法,每次都會產生一次頁面更新。這時建立碎片文檔就顯得十分有用:
var nameList = ['cctv', 'asdf', 'keal', 'jack', 'rose'], i, ii = nameList.length, nameP, text, fgm = document.createDocumentFragment(); for (i = 0; i < ii; i++) { nameP = document.createElement('p'); text = document.createTextNode(nameList[i]); nameP.appendChild(text); fgm.appendChild(nameP); } document.body.appendChild(fgm);
上面代碼中每一個新的p元素都先添加在文檔碎片中,最後調用document.body.appendChild()方法來一次性地將碎片中的子節點添加到DOM中,這意味着只須要進行一次頁面更新。