網頁DOM編程 Node、Document和Element三者關係 Node:各種類型的 DOM API 對象會從這個介面繼承。 Document:表示在任何在瀏覽器中載入的網頁(DOM樹)。 Element:描述所有相同種類的元素所普遍具有的方法和屬性。 完整的繼承關係如下圖: 說明:圖中的子類可 ...
目錄
網頁DOM編程
Node、Document和Element三者關係
Node:各種類型的 DOM API 對象會從這個介面繼承。
Document:表示在任何在瀏覽器中載入的網頁(DOM樹)。
Element:描述所有相同種類的元素所普遍具有的方法和屬性。
完整的繼承關係如下圖:
說明:圖中的子類可以從父類繼承方法和屬性。
DOM編程常用 API 總結
Node節點
屬性方法 | 說明 |
---|---|
Node.nodeName 只讀 |
返回一個包含該節點名字的DOMString 。 |
Node.nodeType 只讀 |
返回一個與該節點類型對應的無符號短整型 的值。 |
Node.nodeValue |
返回或設置當前節點的值。 |
Node.textContent |
返回或設置一個元素內所有子節點及其後代的文本內容。 |
Node.firstChild 只讀 |
返回該節點的第一個子節點Node ,如果該節點沒有子節點則返回null 。 |
Node.lastChild 只讀 |
返回該節點的最後一個子節點Node ,如果該節點沒有子節點則返回null 。 |
Node.previousSibling 只讀 |
返回該節點同級的前一個節點 ( Node ) ,如果不存在返回 null。 |
Node.nextSibling 只讀 |
返回與該節點同級的下一個節點 Node ,如果不存在返回null 。 |
Node.parentNode 只讀 |
返回一個當前節點 Node 的父節點。 |
Node.childNodes 只讀 |
返回一個包含了該節點所有子節點的實時的NodeList 。 |
Node.appendChild() |
將指定的 childNode 參數作為最後一個子節點添加到當前節點。 |
Node.removeChild() |
移除當前節點的一個子節點,這個子節點必須存在於當前節點中。 |
Node.replaceChild() |
將選定的節點替換一個子節點 Node 為另外一個節點。 |
Node.insertBefore() |
在當前節點下增加一個子節點 Node ,並使該子節點位於參考節點的前面。 |
nodeName
特別說明:
-
元素節點的
nodeName
是標簽名稱 -
屬性節點的
nodeName
是屬性名稱 -
文本節點的
nodeName
永遠是#text
-
文檔節點的
nodeName
永遠是#document
nodeValue
特別說明:
-
元素節點的
nodeValue
是null(賦值無效) -
文本節點的
nodeValue
是文本自身 -
屬性節點的
nodeValue
是屬性的值
Document節點
方法 | 說明 |
---|---|
Document.createElement() |
用給定標簽名創建一個新的元素。 |
Document.createTextNode() |
創建一個文本節點。 |
Document.querySelector() |
返迴文檔中與指定的選擇器匹配的第一個元素節點。 |
Document.querySelectorAll() |
返回包含文檔中與指定的選擇器匹配的所有元素節點的列表(NodeList)。 |
註意:NodeList
不是數組,而是一個類數組對象。可稱為DOM集合。它的遍歷方法有以下兩種方式:
- 利用自帶的
forEach
方法 - 轉換成數組形式:
Array.from(nodelist)
、[].slice.call(nodelist)
Element節點
方法 | 說明 |
---|---|
Element.getAttribute() |
返回元素上一個指定的屬性值。 |
Element.setAttribute() |
設置指定元素上的某個屬性值。 |
Element.removeAttribute() |
從指定的元素中刪除一個屬性。 |
Element.clientWidth 只讀 |
返回Number 表示該元素內部的寬度。 |
Element.clientHeight 只讀 |
返回Number 表示內部相對於外層元素的高度。 |
Element.clientTop 只讀 |
返回 Number 表示該元素距離它上邊界的高度。 |
Element.clientLeft 只讀 |
返回Number 表示該元素距離它左邊界的寬度。 |
Element.scrollWidth 只讀 |
返回類型為: Number ,表示元素的滾動視圖寬度。 |
Element.scrollHeight 只讀 |
返回類型為: Number ,表示元素的滾動視圖高度。 |
Element.scrollTop |
返回類型為:Number ,表示該元素縱向滾動條距離 |
Element.scrollLeft |
返回類型為:Number ,表示該元素橫向滾動條距離最左的位移。 |
Element.getBoundingClientRect() |
返回元素的大小及其相對於視口的位置。 |
- 在CSS盒模型中,可視區的寬高如下所示:
根據上面的盒模型圖,可視區的寬高可有以下計算公式:
offsetWidth
= width
+ padding*2
offsetHeight
= width
+ padding*2
- 當滾動條滾動到底部時,有以下計算公式:
scrollHeight
= scrollTop
+ clientHeight
註意:scrollTop是一個動態值,隨著滾動條向下滑動逐漸增加。而clientHeight則是一個靜態值。
HTMLELement節點
屬性 | 說明 |
---|---|
HTMLElement.style |
獲取/設置元素的 style 屬性 |
HTMLElement.offsetWidth 只讀 |
元素自身可視寬度加上左右 border 的寬度 |
HTMLElement.offsetHeight 只讀 |
元素自身可視高度加上上下 border 的寬度 |
HTMLElement.offsetTop 只讀 |
元素自己 border 頂部距離父元素頂部或 body 元素 border 頂部的距離 |
HTMLElement.offsetLeft 只讀 |
元素自己 border 左邊距離父元素 border 左邊或 body 元素 border 左邊的距離 |
HTMLElement.offsetParent 只讀 |
元素的父元素,如果沒有就是 body 元素。若元素脫離文檔流,則為null |
在CSS盒模型中,偏移量的寬高如下所示:
根據上面的盒模型圖,偏移量的寬高可有以下計算公式:
offsetWidth
= width
+border*2
+padding*2
offsetHeight
= width
+border*2
+padding*2
DOM編程 API 應用
接下來利用上面的API去實現以下幾個步驟。首先考慮這樣一個DOM結構,如下:
<div class="list">
<ul style="list-style: none; text-align: center; margin: 0px; padding: 0px;">
<li style="background-color: green;">1</li>
<li style="background-color: green;">2</li>
<li style="background-color: green;">3</li>
<li style="background-color: green;">4</li>
</ul>
</div>
假設這樣一個場景,用戶點擊了某個按鍵。我們希望能使用JS去生成上面的DOM結構。如下:
<input type="button" value="點擊生成列表" onclick="createList()">
<script>
const createList = () => {
// 創建list,設置class屬性。插入body節點末尾
let list = document.createElement("div");
list.setAttribute("class", "list")
document.body.insertBefore(list, null)
// 創建ul節點,設置style樣式。插入list節點內部
let ul = document.createElement("ul");
ul.style.listStyle = "none";
ul.style.textAlign = "center";
ul.style.margin = "0px";
ul.style.padding = "0px";
list.appendChild(ul);
// 創建4個li節點,添加內容並設置style樣式。插入ul節點內部
let li;
for (let i = 1; i <= 4; i++) {
li = document.createElement("li");
li.style.backgroundColor = "blue";
li.textContent = i;
ul.appendChild(li);
}
}
</script>
按鍵點擊後生成DOM結構如下:
我們總結一下步驟。利用JS生成DOM結構的操作如下:
- 創建元素:
Document.createElement()
- 設置屬性:
Element.setAttribute()
- 添加樣式:
HTMLElement.style
- 添加內容:
Node.textContent
- 插入父節點:
Node.appendChild()
參考