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>
三、关键知识点解析
-
事件委托:两个案例都使用了事件委托处理动态元素的事件,通过检查event.target来识别操作源
-
数据驱动:购物车案例将数据与DOM分离,保持数据源(this.items)与视图同步
-
克隆节点:点菜案例使用cloneNode(true)复制完整DOM结构
-
元素定位:
- closest() 方法查找最近的匹配祖先元素
- dataset 属性操作自定义数据属性
-
数值处理:
- 使用toFixed(2)保持货币格式
- 使用parseFloat处理价格转换
-
批量操作优化:
- 文档片段(document.createDocumentFragment)
- 减少DOM操作次数(先计算后更新)
这些案例涵盖了DOM操作的核心知识点,实际开发中可结合CSS实现样式优化,并考虑添加本地存储功能实现数据持久化。
相关文章:
JavaScript学习教程,从入门到精通,DOM节点操作语法知识点及案例详解(21)
DOM节点操作语法知识点及案例详解 一、语法知识点 1. 获取节点 // 通过ID获取 const element document.getElementById(idName);// 通过类名获取(返回HTMLCollection) const elements document.getElementsByClassName(className);// 通过标签名获取…...
基于ESP32 - S3实现一个ping百度的C测试程序
环境准备 安装ESP-IDF开发环境,可参考官方文档。确保开发环境已正确配置,能对ESP32 - S3进行编译和烧录。 实现思路 连接WiFi:让ESP32 - S3连接到一个可用的WiFi网络。初始化Ping功能:利用ESP-IDF提供的Ping API初始化Ping功能…...
英语学习4.15
amateur amateur 🔤 读音:/ˈmətər/ 或 /ˈmətʃʊr/ ✅ 词性:名词 / 形容词 ✅ 中文释义: (名词)业余爱好者 👉 指不是以此为职业的人,通常出于兴趣而从事某项活动。 …...
开源项目FastAPI-MCP:一键API转换MCP服务
在当今AI开发的世界中,应用程序与AI模型之间的无缝集成至关重要。 模型上下文协议(Model Context Protocol, MCP)通过允许AI模型访问外部工具和数据源,弥合了这一差距。 FastAPI MCP是一个强大的工具,它可以通过最少的配置将您现有的FastAPI端点转换为MCP兼容的工具。 本…...
python课堂随记
11.15 连接符 namemcl print(我叫,name) print(我叫name)#连接符 age18 print(我叫name年龄str(age)) #连接符需要数据类型相同 11.17随记 除法运算神奇 8/5 #1.6 8//5 #1 -8/5 #-1.6 -8//5 #-2 ##次方表示—两个** 3的27次方 27的3次方 小结 程序的书写&…...
Agent安装-Beszel 轻量级服务器监控平台
docker-compose安装 beszel-agent 安装 docker-compose 配置文件 services:beszel-agent:image: henrygd/beszel-agent:latestcontainer_name: beszel-agentrestart: unless-stoppednetwork_mode: hostvolumes:- ./beszel_socket:/beszel_socket- /var/run/docker.sock:/var…...
算法—选择排序—js(场景:简单实现,不关心稳定性)
选择排序原理:(简单但低效) 每次从未排序部分选择最小元素,放到已排序部分的末尾。 特点: 时间复杂度:O(n) 空间复杂度:O(1) 不稳定排序 // 选择排序 function selectionSort(arr) {for (let …...
websocket和SSE学习记录
websocket学习记录 websocket使用场景 即时聊天在线文档协同编辑实施地图位置 从开发角度来学习websocket开发 即使通信项目 通过node建立简单的后端接口,利用fs, path, express app.get(*, (req, res) > {const assetsType req.url.split(/)[…...
【统计分析120】统计分析120题分享
1-30 判断题 数学模型 指的是通过抽象、简化现实世界的某些现象,利用数学语言来描述他们的结构和行为,做出一些必要的假设,运用适当的数学工具,得到一个数学结论 数学模型:指的是通过抽象、简化现实世界的某些现象&am…...
【计量地理学】实验四 主成分分析与莫兰指数
一、实验内容 (一) 某地区35个城市2004年的7项经济统计指标数据见(数据中的“题目1”sheet)。 (1)试用最短距离聚类法对35个城市综合实力进行系统聚类分析,并画出聚类谱系图: 在此次实验内容…...
手写call,bind,apply
foo.Mycall(obj,1,2,3) Function.prototype.Mycallfunction(target,...args){if(typeof this!function){throw new TypeError(this is not a function)}// 判断target是否是对象if(targetnull||targetundefined){targetwindow}if(typeof target!object){targetObject(target)}/…...
【读书笔记·VLSI电路设计方法解密】问题64:什么是芯片的功耗分析
低功耗设计是一种针对VLSI芯片功耗持续攀升问题的设计策略。随着工艺尺寸微缩,单颗芯片可集成更多元件,导致功耗相应增长。更严峻的是,现代芯片工作频率较二十年前大幅提升,而功耗与频率呈正比关系。因此,芯片功耗突破…...
Ubuntu18.04安装Qt5.12
本文介绍了在Ubuntu18.04环境下安装QT QT5.12相关安装包下载地址 https://download.qt.io/archive/qt/5.12/ Linux系统下Qt的离线安装包以.run结尾 (sudo apt-get install open-vm-tools open-vm-tools-desktop解决无法paste的问题) 安装 1.cd命令 终端进入对应的文件夹下面 2.…...
【SpringBoot】99、SpringBoot中整合RabbitMQ实现重试功能
最近在做一个项目,需要使用 MQ 实现重试功能,在这里给各位分享一下。 1、整合 RabbitMQ <!-- rabbitmq消息队列 --> <dependency><groupId>org.springframework.boot</groupId><...
max31865典型电路
PT100读取有很多种方案,常用的惠斯通电桥,和专用IC max31865 。 电阻温度检测器(RTD)是一种阻值随温度变化的电阻。铂是最常见、精度最高的测温金属丝材料。铂RTD称为PT-RTD,镍、铜和其它金属亦可用来制造RTD。RTD具有较宽的测温范围&#x…...
每日一道leetcode(补充版)
1004. 最大连续1的个数 III - 力扣(LeetCode) 题目 给定一个二进制数组 nums 和一个整数 k,假设最多可以翻转 k 个 0 ,则返回执行操作后 数组中连续 1 的最大个数 。 示例 1: 输入:nums [1,1,1,0,0,0,1…...
数据通信学习笔记之OSPF的区域
OSPFArea 用于标识一个 OSPF 的区域 区域是从逻辑上将设备划分为不同的组,每个组用区域号 (Area ID)来标识 OSPF 的区域 ID 是一个 32bit 的非负整数,按点分十进制的形式(与 IPV4 地址的格式一样)呈现,例如 Area0.0.0.1。 为了简便起见&#…...
5 提示词工程指南-计划与行动
5 提示词工程指南-计划与行动 计划与行动 Cline 有两种模式: Plan 描述目标和需求、提问与回答、讨论、抽象项目的各个方面、确定技术路线、确定计划 计划与确认相当于架构师,不编写代码Act 按计划编写代码 按照计划编码Plan 模式的本质是构建实际编码前的上下文,Act 的本…...
如何一键批量删除多个 Word 文档中的页眉和页脚
在工作中,许多 Word 文档的页眉页脚中包含公司名称、Logo、电话等信息,用于对外宣传。但有时我们需要批量删除这些页眉页脚信息,尤其当信息有误时,手动逐个删除会增加工作量,导致效率低下。本文将介绍一种便捷的方法&a…...
QCustomPlot中自定义图层
QCustomPlot 使用图层(QCPLayer)系统来组织绘图元素的绘制顺序和可见性。下面详细介绍如何自定义图层并将可绘制对象关联到特定图层。 1. 理解 QCustomPlot 的图层系统 QCustomPlot 的图层系统具有以下特点: 图层按顺序排列,后绘制的图层会覆盖前面的图…...
Dubbo QoS操作手册
QOS 操作手册 QoS概述 启动参数 参数说明默认值qos-enable是否启动Qostrueqos-port启动Qos绑定的端口22222qos-accept-foreign-ip是否运行远程访问falseqos-accept-foreign-whitelist支持的远端地址ip地址(段)无qos-anonymous-access-permission-lefe…...
-实用类-
1. API是什么 2.什么是枚举 !有点类似封装! 2.包装类 注意: 1.Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false 2.当包装类构造方法参…...
Apache Parquet 文件组织结构
简要概述 Apache Parquet 是一个开源、列式存储文件格式,最初由 Twitter 与 Cloudera 联合开发,旨在提供高效的压缩与编码方案以支持大规模复杂数据的快速分析与处理。Parquet 文件采用分离式元数据设计 —— 在数据写入完成后,再追加文件级…...
Spring 事务管理核心机制与传播行为应用
Spring 事务详解 一、Spring 事务简介 Spring 事务管理基于 AOP(面向切面编程)实现,通过 声明式事务(注解或 XML 配置)统一管理数据库操作,确保数据一致性。核心目标:保证多个数据库操作的原子…...
从零开始解剖Spring Boot启动流程:一个Java小白的奇幻冒险之旅
大家好呀!今天我们要一起探索一个神奇的话题——Spring Boot的启动流程。我知道很多小伙伴一听到"启动流程"四个字就开始头疼,别担心!我会用最通俗易懂的方式,带你从main()方法开始,一步步揭开Spring Boot的…...
集合框架(重点)
1. 什么是集合框架 List有序插入对象,对象可重复 Set无序插入对象,对象不可重复(重复对象插入只会算一个) Map无序插入键值对象,键只唯一,值可多样 (这里的有序无序指的是下标,可…...
IPv4地址分类与常用网络地址详解
常见的 IPv4 地址分类: 1. A 类地址(Class A) 范围:0.0.0.0 到 127.255.255.255 默认子网掩码:255.0.0.0 或 /8 用途:通常用于大型网络,例如大型公司、组织。 特点: 网络地址范围…...
模拟实现memmove,memcpy,memset
目录 前言 一、模拟实现memmove 代码演示: 二、模拟实现memcpy 代码演示: 三、模拟实现memset 代码演示: 总结 前言 这篇文章主要讲解了库函数的模拟实现,包含memmove,memcpy,memset 一、模拟实现m…...
uni-app 开发安卓 您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求
您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求。 测试步骤:1、 工作台 -打卡,申请定位权限;2、工作台-设置-编辑资料-更换头像,申请相机、存 储权限。 修改建议:APP在申请敏感权限时,应同步说明权限申…...
RHCSA Linux 系统文件内容显示2
6. 过滤文件内容显示 grep (1)功能:在指定普通文件中查找并显示含指定字符串的行,也可与管道符连用。 (2)格式:grep 选项... 关键字字符串 文件名... (3)常用选项及说…...
