頁面:

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,其 typeid 屬性可透過 JavaScript 存取。屬性值在 HTML 中總是字串,但在 DOM 中可能轉換為布林值、數字等型別。

常用屬性操作方法:

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

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

操作 CSS 樣式

JavaScript 可透過 element.style 屬性直接操作元素的內嵌樣式,例如 element.style.color = "red"。若需一次設定多個樣式,可使用 style.cssTextsetAttribute("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 事件在使用者滾動頁面時觸發,可透過 scrollTopscrollLeft 取得滾動偏移量。scrollIntoView() 方法則可將指定元素滾動至可視範圍。

焦點事件

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

事件委派(Event Delegation)

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

自訂事件與 dispatchEvent

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

MutationObserver

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

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

JavaScript 表單操作與事件處理

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

表單結構與提交流程

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

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

表單資料驗證與控制

在提交前,開發者可讀取欄位的 value 屬性進行驗證。若資料不符合要求,可透過修改 styleplaceholder 提示使用者錯誤原因。若驗證成功,可使用 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 屬性則決定使用 GETPOST 傳送資料。

<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>
--- 如果你想要把這些範例整合成一個完整的登入頁面或表單元件,我也可以幫你設計!你想要加上驗證提示、動畫效果還是切換語言?我都可以幫你搞定。

發佈留言

較新的 較舊