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.mzph.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:检查视频是否在浏览器中显示…