DOM描述了一個層次化的節點樹,容許開發人員添加、移除和修改頁面。javascript
根據 W3C 的 HTML DOM 標準,HTML 文檔中的全部內容都是節點:html
每一個節點都有一個nodeType屬性,用於代表節點的類型。並非全部節點類型都受到Web瀏覽器支持,最經常使用的事元素和文本節點。java
Node.ELEMENT_NODE(1); // 元素
Node.ATTRIBUTE_NODE(2); // 屬性
Node.TEXT_NODE(3); // 文本
Node.CDATA_SECTION_NODE(4);
Node.ENTITY_REFERENCE_NODE(5);
Node.ENTITY_NODE(6);
Node.PROCESSING_INSTRUCTION_NODE(7);
Node.COMMENT_NODE(8); // 註釋
Node.DOCUMENT_NODE(9); // 文檔
Node.DOCUMENT_TYPE_NODE(10);
Node.DOCUMENT_FRAGMENT_NODE(11);
Node.NOTATION_NODE(12);node
由於IE沒有公開Node類型的構造函數,因此肯定節點類型以下:跨域
// nodeType 是隻讀的 if (someNode.nodeType == 1) { alert("Node is an element"); }
一、nodeName 和 nodeValue 屬性數組
// 使用前先檢查節點類型,確認是不是一個元素,對於元素節點 // nodeName 保存的是標籤名(節點的名稱),nodeValue = null (節點的值); if (someNode.nodeType == 1) { value = someNode.nodeName; // nodeName的值是元素的標籤名 }
二、 節點關係瀏覽器
每一個節點都有一個 childNodes 屬性,保存着一個 NodeList 對象。安全
var firstChild = someNode.childNodes[0]; var secondChild = someNode.childNodes.item(1); // 將NodeList對象轉化爲數組 function convertToArray(nodes) { var array = null; try { array = Array.prototype.slice.call(node,0); // 針對非 IE 瀏覽器 } catch { array = new Array(); for (var i=0, len=nodes.length; I < len; i++) { array.push(nodes[I]); } } return array; }
三、操做節點app
如下方法都須要取得父節點(使用 parentNode 屬性)dom
如下兩個方法是全部類型的節點都有
JavaScript經過 Document 類型表示文檔。在瀏覽器中,document 對象是 HTMLDocument(繼承自 Document 類型)的一個實例,表示整個HTML頁面。並且 document 也是 window 對象的一個屬性,所以能夠將其做爲全局對象來訪問。經過這個文檔對象,不只能夠取得與頁面有關的信息,並且還能操做頁面的外觀及其底層結構。
一、文檔的子節點
內置的訪問子節點的快捷方式:
做爲內置的HTMLDocument對象,document 對象有一個 body 屬性,直接指向 <body> 元素。
// 全部瀏覽器都支持 var html = document.documentElement; // 取得對<html>對引用 var body = document.body; // 取得對<body>對引用
用不着在 document 對象上調用 appendChild()、removeChild()和replaceChild()方法,由於文檔類型(若是存在)是隻讀的,並且它只能有一個元素子節點(一般早存在)。
二、文檔信息
document 對象還有一些標準的Document對象所沒有的屬性。這些對象表現的網頁的一些信息。
// 取的文檔標題 var originalTitle = document.title; // 設置文檔標題 document.title = "New page title"; // 取得完成的URL var url = document.URL; // 取的域名 var domain = document.domain; // 取的來源頁面的URL var referrer = document.referrer;
三、查找元素
取得特定的某個或某組元素的引用,而後執行一些操做。
// 取得頁面中全部的<img>元素,並返回一個HTMLCollection var images = document.getElementsByTagName("img"); alert(images.length); // 圖像的數量 alert(images[0].src); // 第一個圖像元素的src特性 alert(images.item(0).src); // 第一個圖像元素的src特性
HMTLCollection 對象
<img src="my image.gif" name="myImage"> var myImage = images.namedItem("myImage"); var myImage = images["myImage"];
四、特殊集合
除了屬性和方法,document 對象還有一些特殊的集合,都是 HTMLCollection對象,
五、DOM一致性檢測
document.implementation 屬性提供相應信息和功能的對象,與瀏覽器對 DOM 的實現直接對應。
規定一個方法:hasFeature(),接受兩個參數:要檢測的 DOM 功能名稱及版本號
var hasXmlDom = document.implementation.hasFeature("XML","1.0");
六、文檔寫入
// 用 write() 和 written() 動態地包含外部資源 <html> <head> <title>document.write() Example</title> </head> <body> <script type="text/javascript"> document.write("<script type=\"text/javascript\" src=\"file.js\">" + "<\/script>"); </script> </body>
嚴格型 XHTML 文檔不支持文檔寫入。
Element 類型用於表現 XML 或 HTML 元素,提供了對元素標籤名、字節點及特性的訪問。
<div id="myDiv"></div> var div = document.getElementById("myDiv"); alert(div.tagName); // "DIV" alert(div.tagName == div.nodeName); // true
在 HTML 中,標籤名始終都以所有大寫表示;而在 XML(有時包括 XHTML),標籤名始終與源代碼中的保持一致。
if (element.tagName.toLowerCase() == "div") { // 適用於任何文檔 // ... }
一、HTML 元素
全部的 HTML 元素都由 HTMLElement 類型表示。每一個 HTML 元素都存在的下列標準特性。
// 上述這些屬性均可以用來取得或修改相應的特性值 <div id="myDiv" class="bd" title="Body text" lang="en" dir="ltr"></div> var div = document.getElementById("myDiv"); alert(div.id); div.id = "someOtherId"; alert(div.className); div.className = "ft";
二、取得特性
每一個元素都有一或多個特性,這些特性的用途是給出相應元素或其內容的附加信息。
有兩類特殊的特性:
div.setAttribute("id","someOtherId");
三、attributes 屬性
attributes 屬性包含一系列節點,每一個節點的 nodeName 就是特性的名稱,而節點的 nodeValue 就是特性的值。
包含一個 NamedNodeMap,「動態」集合。
var id = element.attributes.getNamedItem("id").nodeValue; var id = element.attributes["id"].nodeValue;
遍歷元素的特性,attributes 屬性能夠派上用場。
function outputAttributes(element) { var pairs = new Array(), attrName, attrValue, y, len; for(y = 0, len = element.attributes.length; y < len; y++) { attrName = element.attributes[y].nodeName; attrValue = element.attributes[y].nodeValue; if (element.attributes[y].specified) { pairs.push(attrName + "=\"" + attrValue + "\""); } } return pairs.join(" "); } // attributes 對象的中的特性,不一樣瀏覽器返回的順序不一樣 // IE7 及更早版本會返回 HTML 元素中全部可能的特性,包括沒有指定的特性。每一個特性節點都有一個 specified 的屬性,true:在 HTML 中指定來相應特性,要麼能夠經過 setAttribute() 方法設置了該特性。
四、建立元素
// 接受一個參數,即要建立元素的標籤名 var div = document.createElement("div"); // 也爲新元素設置了 ownerDocument 屬性,還能夠操做元素的特性,添加更多的子節點 div.id = "myNewDiv"; div.className = "box"; // 新元素添加到文檔樹中 appendChild()、insertBefore()、replaceChild() document.body.appendChild(div);
在 IE 中能夠另外一種方法,傳入完整的元素標籤
var div = document.createElement("<div id=\"myNewDiv\" class=\"box\"></div>");
五、元素的子節點
不一樣瀏覽器看待節點是不一樣的。
若是要經過 childNodes 屬性遍歷子節點,不要忘了瀏覽器之間的區別,一般先檢查一下 nodeType 屬性
for (var y = 0, len = element.childNodes.length; y < len; y++) { // 表示是元素節點 if (element.childNodes[y].nodeType == 1) { // ... } }
經過特定的標籤名取得子節點或後代節點
var ul = document.getElementById("myList"); var items = ul.getElementsByTagName("li");
文本節點由 Text 類型表示,包含純文本內容,即包含轉義後的 HTML 字符,但不包含 HTML 代碼。
經過 nodeValue 屬性或 data 屬性訪問 Text 節點包含的文本。
在默認狀況下,每一個能夠包含內容的元素最多隻能有一個文本節點,並且必須確實有內容存在。
// 沒有內容,也就沒有文本節點 <div></div> // 有空格,於是有一個文本節點 <div> </div> // 有內容,於是有一個文本節點 <div>hello world!</div> // 訪問,先取得引用 var textNode = div.firstChild; // 獲取 div.childNodes[0] textNode.nodeValue = "some other message";
在修改文本節點時,此時的字符串會經 HTML 編碼(轉義)。
一、建立文本節點
var element = document.createElement("div"); element.className = "message"; var textNode = document.createTextNode("Hello world"); element.appendChild(textNode); var anotherTextNode = document.createTextNode("Yippee"); element.appendChild(anotherTextNode); document.body.appendChild(element);
若是兩個文本節點是相鄰的同胞節點,那麼這兩個節點中的文本會連起來顯示,中間不會有空格。
二、規範化文本節點
和 Text 類型類似,能夠經過 nodeValue 或 data 屬性來取得註釋的內容。
<div id="myDiv"><!-- A comment --></div> // 經過父節點訪問 var div = document.getElementById("myDiv"); var comment = div.firstChild; alert(comment.data);
使用 document.createComment() 爲其傳遞註釋文本也能夠建立註釋節點。
var comment = document.createComment("A comment");
若是要訪問註釋節點,必定要保證他們是 <html> 元素的後代。
不能把文檔片斷直接添加到文檔中,但能夠做爲一個「倉庫」,保存未來可能添加到文檔中的節點。若是將文檔中的節點添加到文檔片斷中,就會從文檔樹移除該節點,文檔片斷自己不會成爲文檔樹的一部分。
// 建立文檔片斷 var fragment = document.createDocumentFragment(); // 爲 ul 元素添加3個列表項 var ul = document.getElementById("myList"); var li = null; for (var i=0; i < 3; i++) { li = document.createElement("li"); li.appendChild(document.createTextNode("Item " + (i+1))); fragment.appendChild(li); } ul.appendChild(fragment);
元素的特性在 DOM 中以 Attr 類型來表示。特性就是存在於元素的 attributes 屬性中的節點。
儘管是節點,但不是 DOM 文檔樹但一部分。有3個屬性:
// 建立 var attr = document.createAttribute("align"); attr.value = "left"; // 添加到元素中 element.setAttributeNode(attr);