---
# System prepended metadata

title: DOM 操作
tags: [JS 直播班 - 2025 秋季班]

---

>若有任何疑問請至 Discord「作業討論」頻道討論

# DOM 操作
## 本章節我們要學什麼？
熟練了使用 Javascript 來創造與操作資料後，接著就可以開始將資料與網頁互動。在本次章節會循序漸進考驗同學選取、修改、監聽 DOM 頁面的能力。
部分題目下方附有 keywords，表示該題目運用到課堂外的語法或技巧，同學可依照 keywords 搜尋了解概念。

![DOM 示意圖](https://i.imgur.com/66BaU8E.jpg)
::: info
這份 HackMD 還是保持測驗為目的，因此並不會有太多教學的篇幅。
如果遇到問題可以參考助教在出題前整理的筆記，或許會有幫助😎：

* [為什麼你應該要使用資料屬性 data-*](https://www.webdong.dev/post/why-you-should-use-data-attributes/)




為了專注在練習 Javascript，題目都會提供 HTML 架構。不過還是建議同學從頭練習開發整套網頁元件，熟悉與讓思緒在架構、樣式、邏輯間轉換，找到對自己最合適的開發方式。


:::success
助教有特地為這個主題做了懶人包，方法無須背誦，要用到時多查閱文檔即可。
<div style="display: flex; justify-content: center; gap: 1rem">
    <img width="300" src="https://i.imgur.com/RrS6WV4.jpg">
    <img width="300" src="https://i.imgur.com/uwRBkET.jpg">
</div>
:::

## 題目一：選取 DOM
使用以下註解提到的方式來選取 DOM 元件，再打印至終端中。
```htmlembedded
<div data-target id="target" class="target">選我01</div>
<div data-target class="target">選我02</div>
```

```=javascript
// Todo 待完成
// 01. 使用 getElementById + getAttribute("id") 來獲取 01 的 id 內容
console.log(...)
// 02. 使用 getElementsByClassName 來獲取一個 HTMLCollection
console.log(...)
// 03. 使用 querySelector 來獲取一個 Element
console.log(...)
// 04. 使用 querySelectorAll 來獲取一個 NodeList
console.log(...)
// 05. 使用 nextSibling 來獲取一個 Node
console.log(...)

// Output 輸出
// "target"
// HTMLCollection { 0: div#target.target, length: 1, … }
// <div id="target" class="target" data-target="">
// NodeList [ div#target.target, div ]
// #text "\n"
```

## 題目二：修改 DOM
接續第一題，請創造一個 selectMe 變數並存放內文字為"選我01"的元素，並依照以下的要求使用 DOM API 修改其屬性：
* 修改文字為紅色 (inline-style)
* 新增 "hello" 的 class 屬性
* 修改文字內容為 "被選了01"

```javascript
//Todo 待修改
const selectMe = "..."
```
✨keywords：Element.style、Element.classList

## 題目三：監聽 DOM
接續第二題，請為該元素(選我01)設置事件監聽，當被「點擊」時做出以下反應：
* 背景改為黃色
* 內文字改為 "已被點擊！"
* 再點擊一下回復原本狀態(背景與內容文字回復原樣)。

## 題目四：創造、插入 DOM
請製作一個按鈕，當點擊時會在 HTML 文件中新增以下內容：
```htmlembedded
// Todo 待編輯
<button>新增你好世界</button>

// Document Added 新增
<p>你好世界</p>
```
✨keywords：createElement()、appendChild()

## 題目五：監聽表單
請監聽以下表單，當 ```submit``` 事件觸發時阻止預設事件發生，並打印事件至終端。
```htmlembedded
  <form>
    <input name="user" type="input" required>
    <input type="submit" value="獲取資料">
  </form>
```
✨keywords：submit event

## 題目六：加減計數器
請製作一個計數器，具有增加、減少、重設按鈕以及顯示目前數字的功能。
``` html
<div>
    <div>0</div> // 目前數字
    <ul>
      <li><button>+1</button></li> // 按按鈕 +1
      <li><button>Reset</button></li> // 按按鈕重設為 0
      <li><button>-1</button></li> // 按按鈕 -1
    </ul>
</div>
```
![](https://i.imgur.com/nzcQHRa.gif)

## 題目七：加減計數器(進階)
接續題目六，請製作並監聽一個表單，讓用戶可以修改一次增加與減少的數量。
```htmlembedded
<form>
  <input type="number" min="0" name="counterMultiplier" placeholder="請輸入計數器要乘多少倍" required>
  <input type="submit" value="提交倍數">
</form>
```

## 題目八：手風琴
![](https://i.imgur.com/sJwchnJ.gif)
請製作一個點擊按鈕可以切換文字顯示狀態的元件，有 n 多個這樣的元件，請一次選取起來並綁上監聽。


## 題目九：頁籤

![](https://i.imgur.com/UKCsSJC.gif)
請製作一個具有頁籤功能的元件，有 n 多個這樣的元件，請一次選取起來並綁上監聽。

## 題目十：代辦事項

請製作一個代辦事項，像上周的題目一樣，不過將內容呈現至網頁中。
![](https://i.imgur.com/wJh2lw1.gif)



<!-- 參考答案： 

https://codepen.io/fhljksmg-the-styleful/pen/PwZbZVV

答案僅供參考，
答案會使用各種方式書寫(非最佳化)並加上部分解說，
適合初學者還不太會解題或者是該題卡住的同學。
-->