# 樹狀結構與 DOM 節點 ###### tags: `javascript`,`DOM` ## DOM:文件物件模型 ### ==文件 & 物件模型== **DOM 的全名為文件物件模型 (Document Object Model)**, DOM 規格由這兩個組織:W3C 和 WhatWG 共同制定,並由 WhatWG 統一發布 DOM Living Standard。各家瀏覽器廠商再依照規格實作出 DOM,並提供相關的 JavaScript 操作語法。 Document Object Model 其中 document 指的是瀏覽器裡的 HTML 網頁,而 object model 示意如下圖: ![](https://i.imgur.com/nIRw9uH.png) 瀏覽器載入 HTML 以後,會進一步把 HTML 的語法結構,解析成為上圖右的物件模型,在這個示意圖中我們挑選其中幾個屬性來舉例: * object model 和 HTML 文件的結構是一致的 * 以 p 和 em 為例,在物件模型裡形成了父子階層關係 任何在網頁裡出現的內容,無論看得到或看不到的,都會被解析成為 DOM 的一部分,包含註解。 **DOM 是瀏覽器開放給程式語言操作網頁元素的一種介面!** ## ==樹狀結構:DOM Tree== DOM 採用**樹狀結構 (tree) 來儲存網頁元素,樹狀結構是資料結構的一種,特色是有明確的父子階層關係,也因為階層關係明確**,按相對關係查找資料特別方便。 ![](https://i.imgur.com/klceBoJ.png) 樹狀裡每一個部分叫做「節點 (node)」,節點有四種類型: * **元素節點 (element node)** * **文字節點 (text node)** * 屬性節點 (attribute node) * 註解節點 (comment node) # ==根節點:document== **在 DOM 的樹狀結構裡,根節點是 document,代表網頁的本身。** 打開一個網頁,然後在 console 裡輸入 document。按下 enter 後會回傳 #document,這是一個元素節點,將其展開之後你會發現裡面是所有的 HTML 文件內容: ![](https://i.imgur.com/wCarPz8.png) 你在 DevTool 的 Elements 面板裡看到的內容就是 DOM 的結構,**他不是你的 HTML 文件,而是 DOM 操作的結果,如果你使用 JavaScript 改變 DOM 的狀態,瀏覽器顯示在 Elements 會同步更新。** 所有操作語法都繼承自 document 這個物件,你可以直接透過 DevTools 來查看document 物件的屬性與方法。 ## ==瀏覽器也是物件模型== 最後要提醒你 window 的存在,在 document 物件模型的上層還有 **window,也就是 「瀏覽器物件模型 (Browser Object Model)」,簡稱為 BOM。** ==BOM 的根節點是 window,也就是視窗== ![](https://i.imgur.com/OhaLBqU.png) window 之下還有其他的子物件包括 screen、navigator、location、history、frames、document。剛才提到的 document 是其中一部分。 ### ==根節點:window== 這次請你在 console 裡輸入 window,這次跑出來的內容不太一樣,看起來是一個物件,展開之後有一堆屬性和方法: ![](https://i.imgur.com/uHO8tJo.png) * window.alert 「彈出視窗」: ![](https://i.imgur.com/2JOwjA0.png) 這裡特別提到 window,是因為有時候會不小心把 this 指向 window 物件,所以要特別認識一下,不然會被嚇到。 window 是一個全域物件 (global object),它不會受到 local scope 的限制。全域物件是可以省略不寫的,例如 `window.alert() 等於 alert()` `window.document 等於 document` ### 小結 現在你認識了 DOM,接下來我們要進一步學習如何用 JavaScript 來操作 DOM 元素 (DOM manipulation) ,基本步驟是: 1. 利用 HTML 裡的 id 或 class 等結構,選出一個特定元素 1. 按相對關係,從樹狀結構裡找出目標節點 1. 最後,修改這個目標節點