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 中下載一個延伸模組,下圖所示:

vocus|新世代的創作平台

接著,我們需要連結 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}`;
});
vocus|新世代的創作平台

  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>`;
vocus|新世代的創作平台

  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!");
});
vocus|新世代的創作平台

好,目前你對於一些基本的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> 元素,也就是文字欄。
});
vocus|新世代的創作平台

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

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

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

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







留言
avatar-img
電資鼠 - 您的學習好夥伴
23會員
242內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 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
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
如果你曾經撰寫過網頁,那你一定接觸過 JavaScript 無論是在 NodeJs 或是瀏覽器中運行。 但你有沒有想過,我們寫下的 JS 程式碼,這些看似單純的英文和符號,是如何被轉化為機器能夠理解和執行的程式呢? 今天,讓我們一起深入了解其中的核心主角 ——Google 開發的開源 Java
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
本章目的是為讀者提供有關如何設置JavaScript開發環境的知識,包括在瀏覽器、Node.js和各種編輯器和IDE中編寫和運行JavaScript的信息。此外,本章還介紹了如何架設本地開發伺服器以模擬實際的網頁環境。這些知識對於希望開發前端應用或後端服務的JavaScript開發者來說都是必要的。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
Thumbnail
在這個章節中,我們介紹了HTML的基本概念,包括其作為結構化標記語言的特性、應用領域,以及主要使用者。這些知識為後續的深入學習和實踐奠定了基礎,幫助讀者了解HTML在現代網頁開發中的重要性。
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
JSDoc 全名是 JavaScript Documentation,顧名思義是為 JavaScript 所使用的 API 文件,在程式碼內透過註解的方式撰寫,運行後 JSDoc 會自動掃描註解內容,並生成一份網頁版的文件,對於沒有使用 Typescript 開發的專案,也
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
JavaScript是一種具有動態型別、弱型別、原型繼承等特性的高級腳本語言,應用範圍廣泛,包括前端開發、後端開發、移動應用等。它被各種公司和開源社區廣泛使用。學習JavaScript需要掌握ECMAScript標準、異步編程、模塊系統等知識。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News