DOM節點:
DOM層級結構中最頂端的對象是window對象,而document對象是它的子對象之一。
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>任務清單</title></head><body> <h1>工作安排</h1> <ol id="toDoList"> <li>拖地</li> <li>擦窗戶</li> <li>回郵件</li> </ol> <p id="toDoNotes">完成以上工作,可以看電視。</p></body></html>
當頁面完成加載之後,DOM才是可用的。
html元素包含頁面上的其他全部标簽;
它作為父元素,有兩個子元素,分别是head和body;
head有兩個子元素,分别是meta和title;
body有三個子元素,分别是h1,ol和p;
ol有三個子元素,分别是li;
DOM上這種層次結構的關系,其中的交叉點和末端點稱為“節點”;
節點一般分為元素節點和文本節點,比如段落元素p;文本節點裡包含文本内容;
每種節點類型都有一個關聯值,儲存在屬性nodeType中。
nodeType值 | 節點類型 |
1 | 元素 |
2 | 屬性 |
3 | 文本 |
4 | CDATA區域 |
5 | 實體引用 |
6 | 實體 |
7 | 執行指令 |
8 | HTML注釋 |
9 | 文檔 |
10 | 文檔類型DTD |
11 | 文檔片段 |
12 | 标簽 |
每一個節點都有一個childNodes屬性。用來通路其子節點的。childNodes是一個集合清單,按索引通路。
比如:
var olElement = document.getElementById('toDoList');olElement.childNode;
需要統計節點數量時,可以
var count = 0;for(var i=0;i<olElement.childNodes.length;i++){ if(olElement.childNodes[i].nodeType == 1) { count++; }}
當然,我們也可以将這個放在一個函數中,重複使用
function countListItems(){ var olElement = document.getElementById("toDoList"); var count = 0; for(let i=0; i<olElement.childNodes.length;i++) { if(olElement.childNodes[i].nodeType == 1) { count++; } } alert("List contains " + count + " items");} window.onload = countListItems;
注意,當我們把函數指派給頁面加載函數時,函數不需要帶括号;帶括号表示執行函數體代碼;
firstChild和lastChild屬性:
使用firstChild相當于childNodes【0】,
而lastChild相當于childNodes[childNodes.length - 1];
parentNode屬性:
儲存的是節點的父節點。
nextSibling和previousSibling屬性:
是節點的具有相同父節點的兄弟節點;
使用nodeValue屬性:
它傳回儲存在節點的值;
使用nodeName屬性:
它是個隻讀屬性,可以傳回節點名稱;
nodeName值 | ||
元素标簽名稱 | ||
屬性名稱 | ||
字元串 |
getElementsByTagName方法:
document對象的這個方法,可以獲得特定的全部标簽集合,
比如,
var divS = document.getElementsByTagName("div");
以上就是獲得頁面中全部的div;
完整代碼:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>To Do List</title> <script> function countListItems() { var olElement = document.getElementById('toDoList'); var listItems = olElement.getElementsByTagName("li"); alert("list contains " + listItems.length + " items"); } window.onload = countListItems;</script></head><body> <h1>Things To Do</h1> <ol id="toDoList"> <li>Mow the lawn</li> <li>Clean the windows</li> <li>Answer your email</li> </ol> <p id="toDoNotes">Make sure all these are completed by 8pm so you can watch the game on TV.</p></body></html>
讀取元素的屬性:
<div id="id1" title="report">some text</div>
title就是div的屬性,屬性通常表示為“attribute=value”;
獲得目标元素的屬性,就可以
var myNode = document.getElementById("id1");myNode.getAttribute("title");
如果嘗試通路不存在的屬性時,傳回null;是以有時候我們可以利用這個特點,檢測元素是否有特定的屬性。
if(myNode.getAttribute("xxx")){ ......代碼}
建立新節點:
第一步,建立一個節點。節點此時處于某種不确定節點;
第二部,把節點添加至DOM樹的指定位置;
document對象的createElement方法可以建立任何類型的HTML元素,
var div1 = document.createElement("div");
文本節點,可以使用createTextNode方法建立,
var text1 = document.createTextNode("some text");
操作子節點:
可以使用appendChild()方法,追加節點。
var text1 = document.createTextNode("some text");var div1 = document.createElement("div");div1.appendChild(text1);
這樣div1元素中,就有了一個文本節點。但是appendChild方法總是把節點追加在後面的。
insertBefore()方法:
<div id="id1"> <p id="p1">some text</p> <p id="p2">some text</p></div>
var newPara = document.createElement("p");var p2 = document.getElementById("p2");var div1 = document.getElementById("id1");div1.insertBefore(newPara,p2);
以上就把新節點插入在p1和p2之間。
removeChild()方法:
可以在DOM樹中删除節點。
var div1 = document.getElementById("id1");var p2 = document.getElementById("p2");div1.removeChild(p2);
當父節點不友善引用時,可以使用parentNode屬性代替,
var p2 = document.getElementById("p2);p2.parentNode.removeChild(p2);
setAttribute()方法:
var p2 = document.getElementById("p2);p2.setAttribute("title","some text");
下節我們接着分享。