JS-8: DOM操作全解析

更新於 發佈於 閱讀時間約 1 分鐘

JavaScript 使用文件物件模型(DOM)與 HTML 進行互動。 DOM 是表示 HTML 的物件樹。您可以使用文件物件存取 HTML,該物件代表整個 HTML 文件。

HTML 文件中的標籤、文本、屬性都被解析成節點(Node),以層級結構表示:

節點類型

  • 元素節點(Element Node):如 <html><body> 等標籤。
  • 文本節點(Text Node):標籤內的純文本內容。
  • 屬性節點(Attribute Node):標籤的屬性,如 class="example"
  • 文檔節點(Document Node):整個 HTML 文件的根節點。

HTML 文件中的標籤、文本、屬性都被解析成節點(Node),以層級結構表示:

<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph.</p>
</body>
</html>
Document
└── <html>
├── <head>
│ └── <title>
│ └── "Example"
└── <body>
├── <h1>
│ └── "Hello World"
└── <p>
└── "This is a paragraph."

節點關係:

  • 父節點(Parent Node):直接包含子節點的節點。
  • 子節點(Child Node):直接被父節點包含的節點。
  • 兄弟節點(Sibling Node):共享同一父節點的節點。

接下來我將示範一些常見的操作 (示範都在vscode 中執行)。

為此,你需要在 vscode 中下載一個延伸模組,下圖所示:

raw-image

接著,我們需要連結 JS 程式碼,將<script src="script.js"></script>放置於Body區塊的最後,如下所示。

  <script src="script.js"></script>
</body>

接著就可以開始實際操作了。若要進行測試,撰寫完所有程式碼後,右鍵點擊 HTML 程式碼,選擇 Open with Live Server ,接著按下 F12 ,在選項卡中選擇 Console 就可以進行測試囉。

  1. document.getElementById(),根據ID獲取元素。並使用element.textContent 打印出內容
<h1 id="title">Hello, World!</h1>
const title = document.getElementById("title");
console.log(title.textContent); // "Hello, World!"
  • 此時,你會看到Console 中輸出了你想要的內容。

  1. document.getElementsByClassName(),根據Class獲取元素,用讀取陣列的方式使我們可以針對每一個項目去做文字的更改:
<p class="text">First Paragraph</p>
<p class="text">Second Paragraph</p>
const paragraphs = document.getElementsByClassName("text");
console.log(paragraphs[0].textContent); // "First Paragraph"
paragraphs[1].textContent = "Updated Second Paragraph";
console.log(paragraphs[1].textContent); // "Updated Second Paragraph"

  1. document.querySelector(),回傳文件第一個符合特定選擇器群體的元素
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
<div>
<p class="text">A paragraph</p>
</div>
const paragraph = document.querySelector(".text");
const listItem = document.querySelector("li");
console.log(paragraph.textContent); // "A paragraph"
console.log(listItem.textContent); // "Item 1"

  1. document.querySelectorAll(),把所有符合特定選擇器群體的元素選取起來,並存放於一個陣列,用一些陣列的方法使我們可以針對每一個項目去做文字的更改:
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
const listItems = document.querySelectorAll("li");
listItems.forEach((item, index) => {
item.textContent = `Updated Item ${index + 1}`;
});
raw-image

  1. document.createElement(),用於創建標籤元素,接著使用appendChild()將標籤元素附加到某父節點內。
<div id="container"></div>
const container = document.getElementById("container");
const newElement = document.createElement("p");
newElement.textContent = "This is a new paragraph.";
container.appendChild(newElement);

  1. element.innerHTML,允許讀取或寫入 HTML 結構,也就是說可以插入 HTML 標籤和文本內容,非常靈活,不過缺點是安全性較低。容易遭受 XSS攻擊 (一種網站應用程式的安全漏洞攻擊,是代碼注入的一種。它允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響)。
<div id="content"></div>
const content = document.getElementById("content");
content.innerHTML = `<h1>Test</h1>
<p>This is added with innerHTML</p>`;
raw-image

  1. element.setAttribute(),為元素創建某個新屬性。
<input id="inputField" />
const inputField = document.getElementById("inputField");
inputField.setAttribute("placeholder", "Type here...");

  1. element.removeAttribute(),移除元素的某個屬性
<input id="inputField" placeholder="Type here..." />
const inputField = document.getElementById("inputField");
inputField.removeAttribute("placeholder");

  1. element.classList,透過這個物件可以動態的在節點的 class 屬性上操作。
<div id="box" class="blue"></div>
const box = document.getElementById("box");
box.classList.add("red"); //Add a new class (用來新增一個或多個 CSS 類別到元素中,如果該類別已經存在,不會重複添加。)
box.classList.remove("blue"); //Remove an existing class (用來移除一個或多個 CSS 類別,如果該類別不存在,則不會執行任何動作。)
box.classList.toggle("highlight"); //Toggle a class (如果該類別不存在,則新增該類別,如果該類別已經存在,則移除該類別。)
  • 其中toggle可以傳入第二個參數 force(布林值)來強制決定新增或移除該類別。
const box = document.getElementById("box");
box.classList.toggle("highlight"); // 如果 "highlight" 存在就移除,否則新增
box.classList.toggle("highlight", true); // 強制新增 "highlight"
box.classList.toggle("highlight", false); // 強制移除 "highlight"

  1. remove(),移除元素,若是要隱藏則使用element.style.display = 'none';
<p id="toRemove">This will be removed</p>
const toRemove = document.getElementById("toRemove");
// toRemove.style.display = 'none';
toRemove.remove();

  1. addEventListener(),可以偵測用戶在瀏覽網頁時的各種操作。像是點擊滑鼠、鍵盤輸入。而我們可以讓其執行一些函數功能。
<button id="clickMe">Click Me</button>
const button = document.getElementById("clickMe");
button.addEventListener("click", () => {
alert("Button clicked!");
});
raw-image

好,目前你對於一些基本的DOM操作有了初步認識,不過有幾處細節需要特別留意。

  1. element.innerTextelement.textContent 的區別

innerText 取得的是被 CSS 調整過樣式後渲染的文字;textContent 則是實際取得節點中的文字內容。

<h1 style="text-transform: uppercase;">Hello world</h1>
const h1 = document.querySelector('h1');
console.log(h1.innerText); // HELLO WORLD
console.log(h1.textContent); // Hello world

第2個例子:

<h1>Hello world<span style="display: none;">Hidden Text</span></h1>
const h1 = document.querySelector('h1');
console.log(h1.innerText); // Hello world
console.log(h1.textContent); // Hello worldHidden Text

第3個例子:

<h1>Hello <br />world</h1>
const h1 = document.querySelector('h1');
console.log(h1.innerText);
// 輸出
Hello
world

console.log(h1.textContent); // Hello world
  • innerText 回傳的會是換行的結果;textContent 則會忽略掉它。

  1. addEventListener()的其他事件類型:

keyup示範

<h2>文字欄監測範例</h2>
<label for="textInput">請輸入文字:</label>
<input type="text" id="textInput" placeholder="開始輸入文字...">
// 取得輸入框元素
const textInput = document.getElementById("textInput");

// 監聽 keyup 事件,偵測按下按鍵後放開的行為,並觸發後面的函數。
// 而用戶動作的所有相關資訊,將其打包為event這個參數並傳到函數內
textInput.addEventListener("keyup", (event) => {
// 將用戶按下的鍵名打印到主控台
console.log("目前按下的內容:", event.key);
// 將目前文字欄內的所有值打印到主控台
console.log("輸入的內容:", event.target.value); // event.target 會指向觸發該事件的 <input> 元素,也就是文字欄。
});
raw-image

有了上面的觀念,你也可以開始撰寫一些程式碼的判斷並執行相應的動作,例如:

const textInput = document.getElementById("textInput");

textInput.addEventListener("keyup", (event) => {
if(event.key === "Enter") {
console.log("文字欄內容:", textInput.value);
}
});

addEventListener() 支援許多事件類型,沒有辦法一一示範,不過最基本的觀念掌握好,之後遇到其他事件的處理也都可以快速掌握並使用。







留言
avatar-img
留言分享你的想法!
avatar-img
電資鼠 - 您的學習好夥伴
10會員
215內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
2025/03/03
本章節你將了解 日期物件,包括處理日期的方法以及如何設定日期格式,切入要點的示範所有常見的使用方法範例與應用。
Thumbnail
2025/03/03
本章節你將了解 日期物件,包括處理日期的方法以及如何設定日期格式,切入要點的示範所有常見的使用方法範例與應用。
Thumbnail
2025/03/03
表單驗證是一個在用戶輸入資料時確保其正確性、完整性及格式符合要求的重要功能,它可以在用戶提交表單之前進行檢查,防止錯誤資料的傳輸。本章節將帶你初步了解其原理與使用。
2025/03/03
表單驗證是一個在用戶輸入資料時確保其正確性、完整性及格式符合要求的重要功能,它可以在用戶提交表單之前進行檢查,防止錯誤資料的傳輸。本章節將帶你初步了解其原理與使用。
2025/03/03
本篇文章深入淺出地介紹 JavaScript 正規表達式,從基本語法、常用符號、方法應用到進階的捕獲群組、斷言等,並搭配豐富的範例程式碼,幫助讀者快速掌握正規表達式的使用技巧。
2025/03/03
本篇文章深入淺出地介紹 JavaScript 正規表達式,從基本語法、常用符號、方法應用到進階的捕獲群組、斷言等,並搭配豐富的範例程式碼,幫助讀者快速掌握正規表達式的使用技巧。
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
針對 JavaScript 中的原始型別和隱性轉型進行了詳細的探討
Thumbnail
學習JavaScript的理由有很多,包括容易學習的程式語言、互動式體驗、多功能性、跨平臺、社群和資源豐富、高市場需求。此外,文章提供了設計和前端教學的相關資源連結。文章中還提到了一些與學習JavaScript相關的教學文章和影音教學資源。
Thumbnail
學習JavaScript的理由有很多,包括容易學習的程式語言、互動式體驗、多功能性、跨平臺、社群和資源豐富、高市場需求。此外,文章提供了設計和前端教學的相關資源連結。文章中還提到了一些與學習JavaScript相關的教學文章和影音教學資源。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News