Skip to content

DOM 是什麼?文件物件模型與節點種類完整介紹

什麼是 DOM:文件物件模型

DOM 全名為 Document Object Model,中文為 文件物件模型,它提供了一個文件(樹)的結構化表示法,並定義讓程式可以存取並改變文件架構、風格和內容的方法。

換個說法:您寫的 HTML 是一份文字檔,瀏覽器讀完之後會在記憶體中蓋出一棵由物件組成的樹,這棵樹就是 DOM。JavaScript 能改的是這棵樹,而不是原始的 .html 檔案,所以重新整理頁面後,改動就會消失。

節點(Node)

前面有提到 DOM 的樹狀結構,而且結構中最重要的就是每個節點。任何東西在 HTML 文件中都是一種 DOM 節點,例如:文件、元素、屬性、文字、註解皆是節點。

文件(Document)

Document 就是指這份文件,也就是這份 HTML 檔的開端,所有的一切都會從 Document 開始往下進行。

元素(Element)

Element 就是指文件內的各個標籤,因此像是 <h1><p> 等等各種 HTML 標籤都是被歸類在 Element 裡面。

屬性(Attribute)

Attribute 就是指各個標籤內的相關屬性,例如:hrefsrcclassid

文字(Text)

Text 就是指被各個標籤包起來的文字,舉例來說在 <p> Hello World </p> 中,Hello World 被 <p> 這個 Element 包起來,因此 Hello World 就是此 Element 的 Text。

註解(Comments)

Comment 就是註解 <!---->,任何被註解的程式碼是不會執行。

DOM

由 ‍Birger Eriksson - 自己的作品, CC BY-SA 3.0, 連結

節點之間的關係

樹狀結構的重點在於 關係。以下面這段結構為例,以 <ul> 的視角來看,<h2> 是兄弟、<section> 是父層、<li> 是子層:

html
<section>
  <h2>Hello JavaScript!</h2>
  <ul>
    <li>直譯式語言。</li>
  </ul>
</section>

搞懂關係之後,才能決定要用哪一種方式 選取 DOM,也才有辦法理解 事件傳播 為什麼會由內往外或由外往內跑。

DOM 方法

此外,DOM 也提供了 API 讓我們來使用,Away 喜歡稱 DOM 的原生方法。其方法內容包含了 DOM 的選取、編輯、監聽。我們將會在後續的內容一一介紹給各位。

分類代表方法對應文章
選取querySelector()getElementById()DOM 的選取
編輯textContentinnerHTMLsetAttribute()節點的屬性
監聽addEventListener()什麼是事件

小提醒

Application Programming Interface 縮寫為 API,一般稱為 應用程式介面,API 就像一個介面,可以幫助開發者節省精力,扮演應用程式和應用程式之間的橋樑。DOM API 也是 Web API 的一員。

要留意的是,完全靠 JavaScript 操作 DOM 才產生的內容,搜尋引擎要排隊等第二階段渲染才讀得到,社群平台的爬蟲更是完全不執行 JavaScript。這個落差與驗證方式見 純 CSR 的 SEO 問題

常見問題

DOM 和 HTML 是同一件事嗎?

不是。HTML 是寫在檔案裡的原始碼文字,DOM 是瀏覽器解析那份原始碼後,在記憶體中建立的物件樹。JavaScript 改的是 DOM,不是原始檔案。

節點(Node)與元素(Element)有什麼差別?

節點是所有成員的統稱,包含文件、元素、屬性、文字與註解;元素只是節點的其中一種,也就是各個 HTML 標籤。所以元素一定是節點,節點不一定是元素。這個差別在 事件物件 比較 tagNamenodeName 時會再遇到。

為什麼 DOM 是樹狀結構?

因為 HTML 標籤可以層層包覆,形成父子關係的階層。瀏覽器就依這個階層建立 DOM 樹,程式也才能沿著父層、子層、兄弟層的關係找到目標節點。

什麼是 DOM API?

DOM API 是瀏覽器提供給程式操作 DOM 的方法集合,內容包含節點的選取、內容與屬性的編輯,以及事件的監聽。它屬於 Web API 的一部分。

為什麼程式抓不到 DOM 元素?

多半是程式比元素早執行。<script> 寫在元素之前又沒有加 defer 時,DOM 還沒建立,選取自然回傳 null。加上 defer,或把程式移到元素後面即可,詳見 JavaScript 寫在哪裡

延伸閱讀