Rick's DevNotes
筆記關於我作品集
筆記類別
  • 全部
  • DockerDocker
  • NetworkNetwork
  • RxJSRxJS
  • NginxNginx
  • TypeScriptTypeScript
  • Data_Structure_And_AlgorithmData Structure And Algorithm
  • JavaScriptJavaScript
  • PostgreSQLPostgreSQL
  • ReactReact
  • GitGit

© 2026 Rick's DevNotes. All rights reserved.

# Traversal# DOM# Web APIs

更新時間:2025/08/04

建立時間:2020/09/22

JavaScript 筆記:DOM 操作與遍歷

querySelectorAll 與 getElementsBy... 的差異

在 DOM 操作中,可透過多種方式選取 HTML 元素。需注意,document.querySelectorAll() 回傳的是靜態 NodeList,DOM 變動後內容不會更新。

相對地,document.getElementsBy...() 回傳的是動態 HTMLCollection,會隨 DOM 更新。

創造或插入元素

透過 document.createElement() 可創建新元素,但一個元素實例無法同時存在於多處。

刪除元素

可使用 remove() 直接刪除元素。早期需透過 removeChild() 與父層搭配。

改變或取得 Style 資訊

可透過 element.style 修改樣式,或使用 getComputedStyle() 取得現有樣式。

若有 CSS Variable,可透過 setProperty 修改。

HTML 屬性 (Attribute)

取得屬性可用兩種方式:

  • element.attributeName
  • element.getAttribute('name')

差異在於路徑屬性:前者回傳絕對路徑,後者回傳相對路徑。

HTML 資料屬性 (Data Attribute)

可利用 element.dataset 存取或篩選。

Class 操作

element.classList 提供新增、刪除與切換 class 的方法。

NOTE: 盡量避免直接使用 element.className = 'xxxx',因會覆蓋所有現有 class。

事件監聽

addEventListener 可綁定多個事件,建議優先使用。onevent 屬性會覆蓋舊的事件。

移除監聽器可使用 removeEventListener:

HTML 內直接寫事件屬性則不建議:

DOM 遍歷 (DOM Traversing)

在下方的程式碼中,主要是呈現如何透過 DOM Traversing (遍歷) 來操作和檢視不同層級的節點:

  1. 子層元素 (Children)
    • container.querySelector('.outer'):從 container 節點開始往下搜尋第一個 .outer 元素。
    • container.childNodes:列出所有子節點,包括文字節點(空白也算)。
    • container.children:僅包含子層元素 (不含文字節點)。
    • container.firstElementChild:取得第一個子元素。
  2. 父層元素 (Parent)
    • container.parentNode 與 container.parentElement:都會指向 <body>,差別在於 parentNode 可能包含文字節點。
  3. 尋找最近的外層元素
    • inner.closest('.outer'):向上尋找最近符合 .outer 的祖先元素,並修改背景。
  4. 兄弟元素 (Siblings)
    • container.previousElementSibling:取得前一個兄弟元素,這裡是 <h1>...</h1>。
    • container.nextElementSibling:取得下一個兄弟元素,這裡是 <div class="footer">...</div>。
    • previousSibling / nextSibling:可能回傳文字節點 (#text),因此通常更推薦使用 previousElementSibling 與 nextElementSibling。

參考資料

  • Jonas's JavaScript Course