JavaScript學習教程,從入門到精通,DOM節點操作語法知識點及案例詳解(21)

DOM節點操作語法知識點及案例詳解

一、語法知識點

1. 獲取節點

// 通過ID獲取
const element = document.getElementById('idName');// 通過類名獲取(返回HTMLCollection)
const elements = document.getElementsByClassName('className');// 通過標簽名獲取(返回HTMLCollection)
const tags = document.getElementsByTagName('div');// 通過CSS選擇器獲取單個元素
const el = document.querySelector('.selector');// 通過CSS選擇器獲取所有匹配元素(返回NodeList)
const nodes = document.querySelectorAll('div.item');// 特殊節點獲取
document.documentElement;    // 獲取html元素
document.head;               // 獲取head元素
document.body;               // 獲取body元素

2. 創建節點

// 創建元素節點
const newDiv = document.createElement('div');// 創建文本節點
const textNode = document.createTextNode('Hello World');// 創建文檔片段(優化批量操作)
const fragment = document.createDocumentFragment();

3. 添加節點

// 末尾追加
parentNode.appendChild(childNode);// 指定位置插入
parentNode.insertBefore(newNode, referenceNode);// 插入HTML字符串(更靈活)
parentNode.insertAdjacentHTML('beforeend', '<div>New item</div>');
/*
位置參數:
'beforebegin':元素自身的前面
'afterbegin':插入元素內部的第一個子節點之前
'beforeend':插入元素內部的最后一個子節點之后
'afterend':元素自身的后面
*/

4. 刪除節點

// 傳統方法(需要父節點)
parentNode.removeChild(childNode);// 現代方法(直接操作)
childNode.remove();// 清空所有子節點
while (container.firstChild) {container.removeChild(container.firstChild);
}

5. 克隆節點

const cloneNode = originalNode.cloneNode(true); // true表示深度克隆

6. 節點關系

node.parentNode;        // 父節點
node.childNodes;        // 子節點集合
node.firstChild;        // 第一個子節點
node.lastChild;         // 最后一個子節點
node.previousSibling;   // 前一個兄弟節點
node.nextSibling;       // 后一個兄弟節點

二、綜合案例

案例1:線上點菜系統

<!-- HTML結構 -->
<div class="container"><div class="menu"><h3>菜單列表</h3><ul id="foodList"><li>魚香肉絲 <span class="price">¥28</span></li><li>宮保雞丁 <span class="price">¥32</span></li><li>麻婆豆腐 <span class="price">¥18</span></li></ul></div><div class="ordered"><h3>已點菜品 <span id="total">總計:¥0</span></h3><ul id="orderedList"></ul></div>
</div><script>
// 初始化總價
let totalPrice = 0;// 菜單點擊事件委托
document.getElementById('foodList').addEventListener('click', function(e) {if (e.target.tagName === 'LI') {// 克隆選中的菜品const clonedItem = e.target.cloneNode(true);// 添加刪除按鈕const delBtn = document.createElement('button');delBtn.textContent = '×';delBtn.className = 'delete-btn';clonedItem.appendChild(delBtn);// 添加到已點列表document.getElementById('orderedList').appendChild(clonedItem);// 更新總價const price = parseFloat(e.target.querySelector('.price').textContent.slice(1));totalPrice += price;updateTotal();}
});// 刪除功能委托
document.getElementById('orderedList').addEventListener('click', function(e) {if (e.target.classList.contains('delete-btn')) {const listItem = e.target.parentElement;const price = parseFloat(listItem.querySelector('.price').textContent.slice(1));// 移除元素并更新總價listItem.remove();totalPrice -= price;updateTotal();}
});function updateTotal() {document.getElementById('total').textContent = `總計:¥${totalPrice.toFixed(2)}`;
}
</script>

案例2:電商購物車

<!-- HTML結構 -->
<div class="cart"><h2>購物車 <span id="cartTotal">¥0.00</span></h2><ul id="cartList"></ul><button id="addItem">添加商品</button>
</div><script>
class ShoppingCart {constructor() {this.items = [];this.cart = document.getElementById('cartList');this.init();}init() {// 添加示例商品this.addItem('iPhone 15', 7999);this.addItem('AirPods Pro', 1499);// 事件委托處理所有操作this.cart.addEventListener('click', (e) => {const itemEl = e.target.closest('.cart-item');if (!itemEl) return;const id = itemEl.dataset.id;const item = this.items.find(i => i.id == id);if (e.target.classList.contains('quantity-up')) {item.quantity++;} else if (e.target.classList.contains('quantity-down')) {if (item.quantity > 1) item.quantity--;} else if (e.target.classList.contains('delete-btn')) {this.removeItem(id);}this.updateItem(itemEl, item);this.updateTotal();});document.getElementById('addItem').addEventListener('click', () => {const name = prompt('請輸入商品名稱:');const price = parseFloat(prompt('請輸入商品價格:'));if (name && price) this.addItem(name, price);});}addItem(name, price) {const newItem = {id: Date.now(),name,price,quantity: 1};this.items.push(newItem);this.renderItem(newItem);this.updateTotal();}renderItem(item) {const li = document.createElement('li');li.className = 'cart-item';li.dataset.id = item.id;li.innerHTML = `<span class="name">${item.name}</span><div class="controls"><button class="quantity-down">-</button><span class="quantity">${item.quantity}</span><button class="quantity-up">+</button></div><span class="price">¥${(item.price * item.quantity).toFixed(2)}</span><button class="delete-btn">刪除</button>`;this.cart.appendChild(li);}updateItem(el, item) {el.querySelector('.quantity').textContent = item.quantity;el.querySelector('.price').textContent = `${(item.price * item.quantity).toFixed(2)}`;}removeItem(id) {this.items = this.items.filter(item => item.id != id);document.querySelector(`[data-id="${id}"]`).remove();}updateTotal() {const total = this.items.reduce((sum, item) => sum + item.price * item.quantity, 0);document.getElementById('cartTotal').textContent = `${total.toFixed(2)}`;}
}// 初始化購物車
new ShoppingCart();
</script>

三、關鍵知識點解析

  1. 事件委托:兩個案例都使用了事件委托處理動態元素的事件,通過檢查event.target來識別操作源

  2. 數據驅動:購物車案例將數據與DOM分離,保持數據源(this.items)與視圖同步

  3. 克隆節點:點菜案例使用cloneNode(true)復制完整DOM結構

  4. 元素定位

    • closest() 方法查找最近的匹配祖先元素
    • dataset 屬性操作自定義數據屬性
  5. 數值處理

    • 使用toFixed(2)保持貨幣格式
    • 使用parseFloat處理價格轉換
  6. 批量操作優化

    • 文檔片段(document.createDocumentFragment)
    • 減少DOM操作次數(先計算后更新)

這些案例涵蓋了DOM操作的核心知識點,實際開發中可結合CSS實現樣式優化,并考慮添加本地存儲功能實現數據持久化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77668.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PCA 降維實戰:從原理到電信客戶流失數據應用

一、簡介 在機器學習領域&#xff0c;數據的特征維度往往較高&#xff0c;這不僅會增加計算的復雜度&#xff0c;還可能導致過擬合等問題。主成分分析&#xff08;Principal Component Analysis&#xff0c;簡稱 PCA&#xff09;作為一種經典的降維技術&#xff0c;能夠在保留數…

信創時代編程開發語言選擇指南:國產替代背景下的技術路徑與實踐建議

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

Arcgis10.1的漢化包及破解文件分享

Arcgis10.1的漢化包分享 網上有好多10.2的漢化包&#xff0c;但是10.1的漢化包很少&#xff0c;特在此分析出來給大家 Arcgis10.1破解文件及漢化包: (訪問密碼: 9784) license manager破解安裝文件 另外也分享了license manager破解安裝文件&#xff0c;也在相同的分享鏈接里…

CrewAI Community Version(一)——初步了解以及QuickStart樣例

目錄 1. CrewAI簡介1.1 CrewAI Crews1.2 CrewAI Flows1.3 Crews和Flows的使用情景 2. CrewAI安裝2.1 安裝uv2.2 安裝CrewAI CLI 3. 官網QuickStart樣例3.1 創建CrewAI Crews項目3.2 項目結構3.3 .env3.4 智能體角色及其任務3.4.1 agents.yaml3.4.2 tasks.yaml 3.5 crew.py3.6 m…

word選中所有的表格——宏

Sub 選中所有表格()Dim aTable As TableApplication.ScreenUpdating FalseActiveDocument.DeleteAllEditableRanges wdEditorEveryoneFor Each aTable In ActiveDocument.TablesaTable.Range.Editors.Add wdEditorEveryoneNextActiveDocument.SelectAllEditableRanges wdEdito…

Tkinter與ttk模塊對比:構建現代 Python GUI 的進化之路

在 Python GUI 開發中&#xff0c;標準庫 tkinter 及其子模塊 ttk&#xff08;Themed Tkinter&#xff09;常被同時使用。本文通過功能對比和實際案例&#xff0c;簡單介紹這兩個模塊的核心差異。 1. 區別 Tkinter&#xff1a;Python 標準 GUI 工具包&#xff08;1994年集成&…

Linux系統之部署Dillinger個人文本編輯器

Linux系統之部署Dillinger個人文本編輯器 一、Dillinger介紹1.1 Dillinger簡介1.2 Dillinger特點1.3 使用場景二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹三、檢查本地環境3.1 檢查本地操作系統版本3.2 檢查系統內核版本四、部署Node.js 環境4.1 下載Node.js安裝包4.2 解…

從malloc到free:動態內存管理全解析

1.為什么要有動態內存管理 我們已經掌握的內存開辟方法有&#xff1a; int main() {int val 20;//在棧空間上開辟四個字節char arr[20] { 0 };//在棧空間上開辟10個字節的連續空間return 0; }上述開辟的內存空間有兩個特點&#xff1a; 1.空間開辟的時候大小已經固定 2.數組…

健身房管理系統設計與實現(springboot+ssm+vue+mysql)含萬字詳細文檔

健身房管理系統設計與實現(springbootssmvuemysql)含萬字詳細文檔 健身房管理系統是一個全面的解決方案&#xff0c;旨在幫助健身房高效管理日常運營。系統主要功能模塊包括個人中心、會員管理、員工管理、會員卡管理、會員卡類型管理、教練信息管理、解聘管理、健身項目管理、…

seate TCC模式案例

場景描述 用戶下單時&#xff0c;需要創建訂單并從用戶賬戶中扣除相應的余額。如果訂單創建成功但余額劃扣失敗&#xff0c;則需要回滾訂單創建操作。使用 Seata 的 TCC 模式來保證分布式事務的一致性。 1. 項目結構 假設我們有兩個微服務&#xff1a; Order Service&#x…

【Linux】Rhcsa復習5

一、Linux文件系統權限 1、文件的一般權限 文件權限針對三類對象進行定義&#xff1a; owner 屬主&#xff0c;縮寫u group 屬組&#xff0c; 縮寫g other 其他&#xff0c;縮寫o 每個文件針對每類訪問者定義了三種主要權限&#xff1a; r&#xff1a;read 讀 w&…

《Operating System Concepts》閱讀筆記:p748-p748

《Operating System Concepts》學習第 64 天&#xff0c;p748-p748 總結&#xff0c;總計 1 頁。 一、技術總結 1.Transmission Control Protocol(TCP) 重點是要自己能畫出其過程&#xff0c;這里就不贅述了。 二、英語總結(生詞&#xff1a;3) transfer, transport, tran…

C語言之圖像文件的屬性

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 總有人間一兩風&#xff0c;填我十萬八千夢。 &#x1f680; 路漫漫其修遠兮&#xff0c;吾將上下而求索。 圖像文件屬性提取系統設計與實現 目錄 設計題目設計內容系統分析總體設計詳細設計程序實現…

opencv--基礎

opencv OpenCV是一個實現數字圖像處理和計算機視覺通用算法的開源跨平臺庫。 鏈接 opencv中的cv是什么意思 在OpenCV中&#xff0c;"cv" 是 "Computer Vision"&#xff08;計算機視覺&#xff09; 的縮寫。 opencv的實現語言 opencv的底層實現代碼是使…

Java創建對象的方式

1、通過new關鍵字創建新對象 用new關鍵字創建對象是我們在開發中最常用的方式&#xff0c;new關鍵字會為我們在堆內存中開辟一塊空間以存放對象的引用&#xff08;包含對象本身以及內部屬性的引用&#xff09;。 2、通過newInstance()方法創建新對象 newInstance()方法本質上是…

構建具備推理與反思能力的高級 Prompt:LLM 智能代理設計指南

在構建強大的 AI 系統&#xff0c;尤其是基于大語言模型&#xff08;LLM&#xff09;的智能代理&#xff08;Agent&#xff09;時&#xff0c;Prompt 設計的質量決定了系統的智能程度。傳統 Prompt 通常是簡單的問答或填空式指令&#xff0c;而高級任務需要更具結構性、策略性和…

豬行為視頻數據集

豬行為數據集包含 23 天(超過 6 周)的日間豬行為視頻,這些視頻由近乎架空的攝像機拍攝。視頻已配準顏色和深度信息。數據以每秒 6 幀的速度捕獲,并以 1800 幀(5 分鐘)為一批次進行存儲。大多數幀顯示 8 頭豬。 這里可以看到顏色和深度圖像的示例: 喂食器位于圖片底部中…

C++運算符重載詳解

C++ 中的運算符重載允許為用戶自定義類型(類或結構體)賦予運算符特定功能,使其操作更直觀。以下是運算符重載的關鍵點: 1. 基本語法 成員函數重載:運算符作為類的成員函數,左操作數為當前對象 (this),右操作數為參數。 class Complex {public:Complex operator+(const …

deep-share開源瀏覽器擴展,用于分享 DeepSeek 對話,使用戶能夠將對話內容保存為圖片或文本以便輕松分享

一、軟件介紹 文末提供程序和源碼下載學習 deep-share開源瀏覽器擴展&#xff0c;用于分享 DeepSeek 對話&#xff0c;使用戶能夠將對話內容保存為圖片或文本以便輕松分享。 二、軟件功能 One-click capture of DeepSeek chat content一鍵捕獲 DeepSeek 聊天內容Support sha…

Unity之如何實現RenderStreaming視頻推流

文章目錄 前言引入 UnityRenderStreaming 的好處教程步驟 1:設置環境步驟 2: 創建項目步驟 3:安裝軟件包步驟 5:下載示例步驟 6:檢查配置環境步驟 7:打開推流場景步驟 8: 準備用于流式傳輸的WebServer應用程序步驟 9: 運行 示例場景步驟 10:檢查視頻是否在瀏覽器中顯示…