DOM 操作#

DOM(Document Object Model,文件物件模型)是瀏覽器將 HTML 解析後產生的樹狀結構,JavaScript 可透過 DOM API 讀取或修改網頁內容。

document
└── html
    ├── head
    │   └── title
    └── body
        ├── h1
        ├── p
        └── div
            └── button

選取元素#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 選取單一元素(回傳第一個符合的)
const title = document.querySelector("h1");
const btn = document.querySelector("#submit-btn");      // id
const card = document.querySelector(".card");           // class
const input = document.querySelector("input[type=text]"); // 屬性

// 選取多個元素(回傳 NodeList)
const items = document.querySelectorAll("li");
const cards = document.querySelectorAll(".card");

// 舊式方法(仍常見)
const el = document.getElementById("app");
const els = document.getElementsByClassName("item");

讀取與修改內容#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
const el = document.querySelector("#title");

// 讀取 / 設定文字內容
console.log(el.textContent); // 純文字
el.textContent = "新標題";

// 讀取 / 設定 HTML 內容(可含標籤)
console.log(el.innerHTML);
el.innerHTML = "<strong>粗體標題</strong>";

// 設定輸入框的值
const input = document.querySelector("input");
console.log(input.value);
input.value = "預設文字";

修改樣式與 Class#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
const box = document.querySelector(".box");

// 直接修改樣式
box.style.color = "red";
box.style.backgroundColor = "#f0f0f0";
box.style.display = "none"; // 隱藏元素

// 操作 class(推薦)
box.classList.add("active");       // 加入
box.classList.remove("hidden");    // 移除
box.classList.toggle("selected");  // 切換(有則移除,無則加入)
box.classList.contains("active");  // 判斷是否有此 class

// 直接設定(會覆蓋所有 class)
box.className = "box active";

讀取與設定屬性#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
const img = document.querySelector("img");

// 讀取屬性
console.log(img.getAttribute("src")); // 讀取 src
console.log(img.src);                 // 同上(部分屬性可直接存取)

// 設定屬性
img.setAttribute("alt", "圖片說明");
img.src = "new-image.jpg";

// 移除屬性
img.removeAttribute("disabled");

// data-* 自定屬性
// <div data-user-id="123" data-role="admin">
const div = document.querySelector("div");
console.log(div.dataset.userId); // "123"
console.log(div.dataset.role);   // "admin"

建立與插入元素#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// 建立元素
const newItem = document.createElement("li");
newItem.textContent = "新項目";
newItem.classList.add("list-item");

// 插入到父元素
const list = document.querySelector("ul");
list.appendChild(newItem);          // 加到末尾
list.prepend(newItem);              // 加到開頭

// 插入到特定位置
list.insertBefore(newItem, list.firstChild);

// insertAdjacentHTML — 快速插入 HTML 字串
list.insertAdjacentHTML("beforeend", "<li>快速插入</li>");
// 位置:"beforebegin" | "afterbegin" | "beforeend" | "afterend"

移除元素#

1
2
3
4
5
6
7
const item = document.querySelector(".remove-me");

// 移除元素
item.remove();

// 移除子元素(舊式)
item.parentNode.removeChild(item);

遍歷 DOM#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
const el = document.querySelector("#parent");

// 子元素
console.log(el.children);           // HTMLCollection(只含元素節點)
console.log(el.firstElementChild);  // 第一個子元素
console.log(el.lastElementChild);   // 最後一個子元素

// 父元素
console.log(el.parentElement);

// 兄弟元素
console.log(el.previousElementSibling);
console.log(el.nextElementSibling);

// 遍歷所有 li
document.querySelectorAll("li").forEach(item => {
    item.style.color = "blue";
});

實際範例:動態清單#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html>
<body>
  <input id="input" type="text" placeholder="輸入項目">
  <button id="add-btn">新增</button>
  <ul id="list"></ul>

  <script>
    const input = document.querySelector("#input");
    const btn = document.querySelector("#add-btn");
    const list = document.querySelector("#list");

    btn.addEventListener("click", () => {
        const text = input.value.trim();
        if (!text) return;

        const li = document.createElement("li");
        li.textContent = text;

        // 新增刪除按鈕
        const del = document.createElement("button");
        del.textContent = "刪除";
        del.onclick = () => li.remove();

        li.appendChild(del);
        list.appendChild(li);
        input.value = "";
    });
  </script>
</body>
</html>

Reference#