頁面:

JavaScript DOM 文件物件模型

JavaScript DOM 操作入門

DOM(Document Object Model,文件物件模型)是瀏覽器用來表示 HTML 或 XML 文件的結構化 API。它將整個文件轉換為節點樹,讓開發者能夠透過 JavaScript 操作網頁內容,包括新增、刪除或修改元素。

在 DOM 中,所有內容都是節點,主要分為三種類型:元素節點(如 <div>、<p>)、文字節點(元素中的文字與空白)與註解節點。節點之間的關係類似家族樹,例如 <body> 是 <html> 的子節點,而 <head> 與 <body> 是兄弟節點。

JavaScript 提供多種方式選取 DOM 元素:

  • getElementById():根據唯一的 id 屬性選取元素。
  • getElementsByName():根據 name 屬性選取一組元素。
  • getElementsByTagName():根據 HTML 標籤名稱選取元素集合。
  • getElementsByClassName():根據 class 名稱選取元素集合。
  • querySelector() / querySelectorAll():使用 CSS 選擇器語法選取單一或多個元素。

其中 querySelectorAll() 回傳的是靜態 NodeList,不會隨 DOM 變化而更新;若需轉換為陣列,可使用 Array.from()。

CSS 選擇器也支援進階組合方式:

  • 群組選擇器(,):選取多個條件的元素。
  • 子元素選擇器(>):選取直接子元素。
  • 相鄰兄弟選擇器(+):選取緊接在某元素後的兄弟元素。
  • 一般兄弟選擇器(~):選取所有在某元素後的兄弟元素。

透過這些選取方式,開發者可以精準地操作網頁元素,實現互動式功能,例如取得輸入值、統計元素數量或動態更新內容。DOM 是前端開發的基礎之一,掌握其操作方式是進階 JavaScript 技能的重要一環。

JavaScript DOM 節點操作與元素遍歷

在 JavaScript 中,DOM(Document Object Model)提供了一套 API,讓開發者能夠操作 HTML 文件的結構與內容。DOM 將整個文件表示為一棵節點樹,節點之間具有父子與兄弟關係,類似於家族譜系。

節點遍歷(Traversing the DOM)

開發者可以透過以下屬性在節點之間移動:

  • parentNode:取得指定節點的父節點。
  • firstChild / lastChild:取得第一或最後的子節點(可能是文字節點)。
  • firstElementChild / lastElementChild:僅取得元素型別的子節點。
  • childNodes:回傳所有子節點(包含文字節點)的 NodeList。
  • children:回傳所有元素子節點的 HTMLCollection。
  • nextElementSibling / previousElementSibling:取得相鄰的兄弟元素節點。

節點操作(Manipulating Elements)

JavaScript 提供多種方法來建立與修改 DOM 節點:

  • createElement(tag):建立新的元素節點。
  • appendChild(node):將節點加入至指定父節點的最後。
  • textContent:讀取或設定元素內的所有文字內容(包含隱藏文字與換行)。
  • innerText:僅讀取或設定可見的文字內容。
  • innerHTML:讀取或設定元素內的 HTML 結構。

雖然 innerHTML 使用方便,但在處理使用者輸入時應避免使用,因為可能導致安全性問題(如 XSS 攻擊)。相較之下,createElement 搭配 appendChild 更安全且效能更佳,因為它不會重建整個 DOM 結構。

實務應用

透過 DOM 操作,開發者可以實現各種互動功能,例如:

  • 動態新增或刪除清單項目。
  • 建立簡易的按鈕點擊事件來遍歷清單。
  • 建立計算機介面,透過按鈕與顯示區域進行輸入與運算。

掌握 DOM 節點操作與元素遍歷是前端開發的基礎能力,有助於開發更具互動性與動態性的網頁應用。

JavaScript DOM 高階元素操作

在 JavaScript 中,DOM(Document Object Model)提供了一套強大的 API,讓開發者能夠操作網頁的結構與內容。除了基本的節點選取與遍歷,DOM 還支援高效的元素操作方式,包括使用 DocumentFragment、插入與替換節點、複製與刪除元素等,這些技巧有助於提升效能與安全性。

DocumentFragment 與效能優化

DocumentFragment 是一種輕量級的 DOM 結構,允許開發者在不影響主 DOM 樹的情況下建立與操作元素。由於它不會觸發瀏覽器的重排(reflow),可用於批量新增元素後再一次性插入至 DOM,有效減少效能損耗。

插入與替換節點

DOM 提供多種插入節點的方法:

  • appendChild():將節點加入至父節點的最後。
  • insertBefore():將新節點插入至指定子節點之前。
  • insertAdjacentHTML():以文字形式插入 HTML 結構,支援四種位置。
  • replaceChild():以新節點替換指定的舊節點。

insertAfter() 可透過 insertBefore() 搭配 nextElementSibling 實作。

append() 與 prepend()

append() 可同時插入多個節點或字串,適合批量操作;prepend() 則將內容插入至父節點的最前方。兩者皆支援 DOMString 與 Node,但不支援 Internet Explorer。

innerHTML 與 createElement 的比較

innerHTML 可快速插入 HTML 結構,但會重建整個節點內容,影響效能且存在安全風險。相較之下,createElement() 搭配 appendChild() 更安全且高效,適合處理使用者輸入或動態內容。

節點複製與刪除

  • cloneNode(deep):複製節點,deep 參數決定是否包含子節點。
  • removeChild():從父節點移除指定子節點,並可儲存以便稍後重新加入。

這些方法可用於實作佇列(Queue)、歷史紀錄、動態清單等互動功能。

JavaScript DOM 屬性與樣式操作

在 JavaScript 中,DOM(Document Object Model)不僅允許開發者操作網頁結構與內容,也提供了操作 HTML 屬性與 CSS 樣式的能力。透過 DOM API,開發者可以動態讀取、修改元素的屬性、樣式與類別,進一步實現互動式與主題化的網頁設計。

屬性與屬性值

HTML 元素的屬性在瀏覽器解析後會轉換為 DOM 物件的屬性。例如,<input type="text" id="username"> 會生成一個 HTMLInputElement,其 type 與 id 屬性可透過 JavaScript 存取。屬性值在 HTML 中總是字串,但在 DOM 中可能轉換為布林值、數字等型別。

常用屬性操作方法:

  • getAttribute(name):取得指定屬性的值。
  • setAttribute(name, value):設定或新增屬性。
  • removeAttribute(name):移除指定屬性。
  • hasAttribute(name):判斷元素是否具有指定屬性。

data-* 屬性提供自訂資料儲存方式,可透過 element.dataset 物件存取。

操作 CSS 樣式

JavaScript 可透過 element.style 屬性直接操作元素的內嵌樣式,例如 element.style.color = "red"。若需一次設定多個樣式,可使用 style.cssText 或 setAttribute("style", ...)。

若需取得元素最終呈現的樣式(包含外部與嵌入式樣式),可使用 window.getComputedStyle(element) 方法。

類別操作(Class)

元素的 className 屬性可讀取或設定整個 class 字串。若需更細緻地操作類別,可使用 classList 屬性,它是一個 DOMTokenList,提供以下方法:

  • add():新增類別。
  • remove():移除類別。
  • replace(old, new):替換類別。
  • contains():判斷是否包含某類別。
  • toggle():切換類別存在與否。

這些方法可用於實作主題切換、選單高亮、面板顯示等互動功能。

JavaScript DOM 事件處理入門

在 JavaScript 中,事件(Event)是使用者與網頁互動時所觸發的行為,例如點擊、滑鼠移動、鍵盤輸入等。DOM 提供一套事件模型與監聽機制,讓開發者能夠針對特定事件執行程式邏輯,實現互動式網頁功能。

事件模型與事件流

事件流描述事件在 DOM 樹中傳遞的順序,主要分為兩種模式:

  • 事件捕獲(Capturing):事件從最外層節點向內層傳遞。
  • 事件冒泡(Bubbling):事件從最內層節點向外層傳遞。

大多數瀏覽器預設使用事件冒泡模式,開發者可透過 addEventListener 的第三個參數設定是否使用捕獲模式。

事件監聽與處理方式

JavaScript 提供三種事件處理方式:

  1. HTML 屬性方式:直接在 HTML 標籤中使用 onclick 等屬性。
  2. DOM Level 0:使用元素的事件屬性(如 element.onclick = function)設定處理函式。
  3. DOM Level 2:使用 addEventListener 註冊事件,並可使用 removeEventListener 移除。

addEventListener 支援多個事件監聽器,並可接收事件物件(event),透過 event.target 取得觸發事件的元素。

常見事件類型

  • 滑鼠事件:click、dblclick、mousedown、mouseup、mousemove、mouseover、mouseout、mouseenter、mouseleave
  • 鍵盤事件:keydown、keyup、keypress
  • 頁面載入事件:DOMContentLoaded、load、beforeunload、unload

DOMContentLoaded 在 DOM 結構建立完成後觸發,適合初始化操作;load 則在所有資源載入完成後觸發。

滑鼠座標與按鍵偵測

事件物件提供滑鼠座標資訊:

  • event.clientX / event.clientY:相對於瀏覽器視窗的位置。
  • event.screenX / event.screenY:相對於螢幕的位置。

此外,event.button 可用於判斷使用者按下的是哪個滑鼠按鍵(左鍵、中鍵、右鍵等)。

透過事件處理機制,開發者能夠精準掌握使用者行為,並即時回應,打造互動性強且使用者友善的網頁介面。

JavaScript DOM 高階事件處理

JavaScript 的事件系統是前端互動的核心之一。除了基本的滑鼠與鍵盤事件,DOM 還支援滾動、焦點、委派與自訂事件等進階功能,並提供 MutationObserver 監控 DOM 結構變化。這些技術讓開發者能夠更精準地掌握使用者行為與網頁狀態,提升互動性與效能。

鍵盤事件

鍵盤事件包括 keydown(按鍵按下)、keyup(按鍵放開)與 keypress(按下字元鍵)。其中 event.key 回傳按下的字元,而 event.code 回傳實體鍵位代碼。

滾動事件與座標

scroll 事件在使用者滾動頁面時觸發,可透過 scrollTop 與 scrollLeft 取得滾動偏移量。scrollIntoView() 方法則可將指定元素滾動至可視範圍。

焦點事件

焦點事件包括 focus(獲得焦點)與 blur(失去焦點),常用於表單欄位的樣式提示與驗證。

事件委派(Event Delegation)

事件委派是一種效能優化技巧,透過在父元素上綁定事件監聽器,統一處理子元素的事件。這種方式可減少事件綁定數量,提升效能。

自訂事件與 dispatchEvent

開發者可透過 dispatchEvent() 主動觸發事件,並使用 isTrusted 判斷事件來源。

MutationObserver

MutationObserver 可偵測 DOM 結構變化,包括節點新增、移除、屬性變更與文字修改。透過 observe() 方法與選項設定,可精準控制監控範圍與類型。

透過這些高階事件處理技巧,JavaScript 開發者能夠打造更靈活、反應更即時的網頁應用,並有效管理複雜的互動邏輯與動態內容。

JavaScript 表單操作與事件處理

JavaScript 在網頁表單(Web Forms)中扮演關鍵角色,能夠即時監聽使用者輸入、驗證資料、控制提交流程,並處理各種輸入元件如文字欄位、單選鈕、核取方塊與下拉選單。透過 DOM API,開發者可建立互動性高且具備資料驗證能力的動態表單。

表單結構與提交流程

HTML 表單使用 <form> 元素定義,並透過 action 屬性指定提交目的地,method 屬性則決定使用 GET 或 POST 傳送資料。JavaScript 可透過 document.forms 取得頁面上的所有表單,並使用 form.elements 存取表單內的各個欄位。

提交表單時會觸發 submit 事件,開發者可使用 addEventListener 綁定事件處理函式,並透過 event.preventDefault() 阻止預設提交行為,以進行資料驗證或其他邏輯處理。

表單資料驗證與控制

在提交前,開發者可讀取欄位的 value 屬性進行驗證。若資料不符合要求,可透過修改 style 或 placeholder 提示使用者錯誤原因。若驗證成功,可使用 form.submit() 主動提交表單,但需注意此方法不會觸發 submit 事件。

特殊輸入元件處理

  • 單選鈕(Radio Button):使用相同 name 屬性群組化,僅允許選擇一項。可透過迴圈與 checked 屬性判斷選項。
  • 核取方塊(Checkbox):允許多項選擇,需使用陣列儲存所有被勾選的值。
  • 下拉選單(Select Box):使用 <select> 搭配 <option> 元素建立,透過 element.value 取得選定值。

表單事件監聽

  • change:當元素值變更並失去焦點時觸發,適用於輸入欄位、單選鈕、核取方塊與下拉選單。
  • input:每次值變更即觸發,適用於即時監聽輸入欄位、文字區塊與選單。

透過這些事件,開發者可即時更新介面、提示錯誤或進行互動式操作。

JavaScript 表單操作不僅提升使用者體驗,也強化前端資料驗證與互動能力,是現代網頁開發不可或缺的一環。

JavaScript 表單操作與事件處理

JavaScript 在網頁表單(Web Forms)中扮演關鍵角色,能夠即時監聽使用者輸入、驗證資料、控制提交流程,並處理各種輸入元件如文字欄位、單選鈕、核取方塊與下拉選單。透過 DOM API,開發者可建立互動性高且具備資料驗證能力的動態表單。

表單結構與提交流程

HTML 表單使用 <form> 元素定義,並透過 action 屬性指定提交目的地,method 屬性則決定使用 GET 或 POST 傳送資料。

<form action="/login" method="post">
  <input type="text" name="username" />
  <button type="submit">登入</button>
</form>

監聽 submit 事件並驗證資料

使用 addEventListener 綁定 submit 事件,並使用 preventDefault() 阻止預設提交行為:

<script>
let form = document.querySelector("form");
form.addEventListener("submit", function(event) {
  let username = form.elements["username"].value;
  if (username === "") {
    alert("請輸入使用者名稱");
    event.preventDefault();
  }
});
</script>

單選鈕(Radio Button)

使用相同 name 屬性群組化,僅允許選擇一項:

<input type="radio" name="gender" value="M"> 男性
<input type="radio" name="gender" value="F"> 女性
<button onclick="checkGender()">送出</button>

<script>
function checkGender() {
  let radios = document.querySelectorAll("input[name='gender']");
  for (let radio of radios) {
    if (radio.checked) {
      console.log("選擇性別:" + radio.value);
    }
  }
}
</script>

核取方塊(Checkbox)

允許多項選擇,使用陣列儲存:

<input type="checkbox" name="color" value="red"> 紅色
<input type="checkbox" name="color" value="blue"> 藍色
<button onclick="checkColors()">送出</button>

<script>
function checkColors() {
  let boxes = document.querySelectorAll("input[name='color']");
  let selected = [];
  for (let box of boxes) {
    if (box.checked) {
      selected.push(box.value);
    }
  }
  console.log("選擇顏色:" + selected.join(", "));
}
</script>

下拉選單(Select Box)

使用 <select> 搭配 <option>:

<select id="language">
  <option value="js">JavaScript</option>
  <option value="py">Python</option>
</select>
<button onclick="checkLanguage()">送出</button>

<script>
function checkLanguage() {
  let lang = document.querySelector("#language").value;
  console.log("選擇語言:" + lang);
}
</script>

input 與 change 事件

input 事件在每次輸入時觸發,change 事件在失去焦點後觸發:

<input type="text" id="username">
<div id="display"></div>

<script>
let input = document.querySelector("#username");
input.addEventListener("input", function() {
  document.querySelector("#display").textContent = input.value;
});
</script>
--- 如果你想要把這些範例整合成一個完整的登入頁面或表單元件,我也可以幫你設計!你想要加上驗證提示、動畫效果還是切換語言?我都可以幫你搞定。

發佈留言

較新的 較舊