六十天前端强化训练之第十天之DOM操作基础

=====欢迎来到编程星辰海的博客讲解======

目录

一、DOM核心概念

1.1 DOM树结构

1.2 节点类型

1.3 节点关系

二、基本DOM操作

2.1 元素选择

2.2 元素创建/修改

2.3 节点操作

三、事件处理机制

3.1 事件流三个阶段

3.2 事件绑定

3.3 事件对象

四、动态表格案例

4.1 核心代码

4.2 实现效果

4.3 学习要点总结

4.4 扩展阅读推荐

官方文档

优质文章

推荐书籍

五、进阶技巧


一、DOM核心概念

1.1 DOM树结构

DOM(Document Object Model)将HTML文档表示为树形结构,由多个节点组成:

  • 文档节点:整个文档的根节点
  • 元素节点:HTML标签
  • 属性节点:元素的属性
  • 文本节点:元素包含的文本内容
  • 注释节点:HTML注释

1.2 节点类型

每个DOM节点都有nodeType属性:

JAVASCRIPT

Node.ELEMENT_NODE(1)   // 元素节点
Node.ATTRIBUTE_NODE(2) // 属性节点
Node.TEXT_NODE(3)      // 文本节点
// ...其他类型

1.3 节点关系

  • parentNode
  • childNodes
  • firstChild/lastChild
  • nextSibling/previousSibling

二、基本DOM操作

2.1 元素选择

JAVASCRIPT

// 传统方法
document.getElementById('id')
document.getElementsByClassName('class')
document.getElementsByTagName('div')// 现代选择器
document.querySelector('#id') // 返回单个元素
document.querySelectorAll('.class') // 返回NodeList

2.2 元素创建/修改

JAVASCRIPT

// 创建元素
const newDiv = document.createElement('div')
const textNode = document.createTextNode('Hello')// 属性操作
element.setAttribute('data-id', '123')
element.classList.add('active')
element.style.color = 'red'// 内容操作
element.innerHTML = '<span>内容</span>'
element.textContent = '纯文本内容'

2.3 节点操作

JAVASCRIPT

// 插入节点
parent.appendChild(child)
parent.insertBefore(newNode, referenceNode)// 移除节点
parent.removeChild(child)
element.remove()// 替换节点
parent.replaceChild(newChild, oldChild)

三、事件处理机制

3.1 事件流三个阶段

  1. 捕获阶段(从上到下)
  2. 目标阶段
  3. 冒泡阶段(从下到上)

3.2 事件绑定

JAVASCRIPT

// 传统方式
button.onclick = function() {}// 现代方式
element.addEventListener('click', handler, useCapture)

3.3 事件对象

JAVASCRIPT

element.addEventListener('click', function(e) {e.preventDefault() // 阻止默认行为e.stopPropagation() // 阻止冒泡console.log(e.target) // 事件源
})

四、动态表格案例

4.1 核心代码

HTML

<!DOCTYPE html>
<html>
<head><style>table { border-collapse: collapse; width: 100%; }th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }th { background-color: #f2f2f2; cursor: pointer; }tr:hover { background-color: #f5f5f5; }.delete-btn { color: red; cursor: pointer; }</style>
</head>
<body><div id="controls"><button onclick="sortTable('name')">按姓名排序</button><button onclick="sortTable('age')">按年龄排序</button></div><table id="dataTable"><thead><tr><th>姓名</th><th>年龄</th><th>操作</th></tr></thead><tbody id="tableBody"></tbody></table><script>// 初始数据let data = [{ name: '王小明', age: 25 },{ name: '李华', age: 30 },{ name: '张强', age: 22 }];// 渲染表格function renderTable() {const tbody = document.getElementById('tableBody');tbody.innerHTML = '';// 使用文档片段优化性能const fragment = document.createDocumentFragment();data.forEach((item, index) => {const row = document.createElement('tr');// 姓名列const nameCell = document.createElement('td');nameCell.textContent = item.name;// 年龄列const ageCell = document.createElement('td');ageCell.textContent = item.age;// 操作列const actionCell = document.createElement('td');const deleteBtn = document.createElement('span');deleteBtn.className = 'delete-btn';deleteBtn.textContent = '删除';deleteBtn.onclick = () => deleteRow(index);actionCell.appendChild(deleteBtn);row.appendChild(nameCell);row.appendChild(ageCell);row.appendChild(actionCell);fragment.appendChild(row);});tbody.appendChild(fragment);}// 删除行function deleteRow(index) {data.splice(index, 1);renderTable();}// 表格排序function sortTable(field) {data.sort((a, b) => {if (typeof a[field] === 'string') {return a[field].localeCompare(b[field]);}return a[field] - b[field];});renderTable();}// 初始渲染renderTable();</script>
</body>
</html>

4.2 实现效果

  • 初始显示数据表格
  • 点击表头排序(姓名/年龄)
  • 删除行操作
  • 鼠标悬停高亮效果

4.3 学习要点总结

  1. DOM操作基础
  • 元素选择方法对比:querySelector vs getElementById
  • 创建元素的两种方式:innerHTML vs createElement
  • 文档片段优化批量插入

        2.事件处理

  • 事件委托的优势
  • 动态元素的事件绑定
  • 事件冒泡与阻止传播

        3.性能优化

  • 减少重排次数
  • 合理使用事件委托
  • 避免频繁操作DOM

        4.数据驱动视图

  • 保持数据与视图同步
  • 单向数据流实现
  • 响应式更新策略

4.4 扩展阅读推荐

官方文档
  1. MDN DOM文档
  2. W3C DOM规范
  3. DOM Living Standard
优质文章
  1. JavaScript性能优化之DOM操作
  2. 深入理解浏览器渲染原理
  3. 事件委托的原理与实践
  4. 现代JavaScript开发中的DOM操作最佳实践
推荐书籍
  1. 《JavaScript高级程序设计》(第4版)- DOM相关章节
  2. 《你不知道的JavaScript》(中卷)- 异步与性能
  3. 《高性能JavaScript》- 第3章 DOM编程

五、进阶技巧

  1. MutationObserver的使用

JAVASCRIPT

const observer = new MutationObserver(mutations => {mutations.forEach(mutation => {console.log('DOM发生变化:', mutation);});
});observer.observe(document.body, {childList: true,subtree: true,attributes: true
});
  1. 虚拟DOM原理
  • 通过JavaScript对象模拟DOM结构
  • 差异比较算法(Diff算法)
  • 批量更新机制
  1. 性能检测工具
  • Chrome DevTools的Performance面板
  • Lighthouse性能审计
  • requestAnimationFrame优化动画

通过本文的学习,读者应该能够掌握DOM操作的核心概念,理解事件处理机制,并能够实现常见的动态交互功能。建议结合实际项目需求,继续探索更复杂的DOM操作场景和优化策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29050.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 开发工具Visual Studio下载和安装

开发环境与工具 C#的主要开发环境是Visual Studio&#xff0c;这是一个功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了代码编辑、调试、项目管理、版本控制等功能。此外&#xff0c;Visual Studio Code也是一个轻量级的跨平台代码编辑器&#xff0c;支…

linux 系统内核查询

1. 使用uname命令 uname命令可以用来显示系统信息&#xff0c;包括内核版本。 查看完整的内核版本信息&#xff1a;uname -a [rootlocalhost ~]# uname -a Linux localhost.localdomain 4.18.0-448.el8.x86_64 #1 SMP Wed Jan 18 15:02:46 UTC 2023 x86_64 x86_64 x86_64 GN…

Matlab实现车牌识别

车牌识别技术作为现代智能交通系统、安防监控以及诸多车辆管理应用场景中的关键环节&#xff0c;正发挥着日益重要的作用&#xff0c;它能够自动、快速且精准地从车辆图像或视频流中提取车牌信息&#xff0c;实现车辆身份的智能化识别。 技术原理 车牌识别主要依托于图像处理、…

Notepad++ 8.6.7 安装与配置全攻略(Windows平台)

一、软件定位与核心优势 Notepad 是开源免费的代码/文本编辑器&#xff0c;支持超过80种编程语言的高亮显示&#xff0c;相比系统自带记事本具有以下优势&#xff1a; 轻量高效&#xff1a;启动速度比同类软件快30%插件扩展&#xff1a;支持NppExec、JSON Viewer等200插件跨文…

深入探究LLamaFactory推理DeepSeek蒸馏模型时无法展示<think>思考过程的问题

文章目录 问题背景初始测试与问题发现LLaMA Factory测试结果对照实验:Ollama测试系统性排查与解决方案探索1. 尝试更换模板2. 深入研究官方文档3. 自定义模板实现优化界面展示:实现思考过程的可视化实现方法参数调整影响分析实验一实验二🎉进入大模型应用与实战专栏 | 🚀…

从零开始在Windows使用VMware虚拟机安装黑群晖7.2系统并实现远程访问

文章目录 前言1.软件准备2. 安装VMware17虚拟机3.安装黑群晖4. 安装群晖搜索助手5. 配置黑群晖系统6. 安装内网穿透6.1 下载cpolar套件6.2 配置群辉虚拟机6.3 配置公网地址6.4 配置固定公网地址 总结 前言 本文主要介绍如何从零开始在Windows系统电脑使用VMware17虚拟机安装黑…

康谋分享 | 3DGS:革新自动驾驶仿真场景重建的关键技术

随着自动驾驶技术的迅猛发展&#xff0c;构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下&#xff0c;3D高斯点阵渲染&#xff08;3DGS&#xff09;技术应运而生&#xff0c;成为自动驾驶仿真场景重…

WPS AI+office-ai的安装、使用

** 说明&#xff1a;WPS AI和OfficeAI是两个独立的AI助手&#xff0c;下面分别简单讲下如何使用 ** WPS AI WPS AI是WPS自带AI工具 打开新版WPS&#xff0c;新建文档后就可以看到菜单栏多了一个“WPS AI”菜单&#xff0c;点击该菜单&#xff0c;发现下方出现很多菜单&#xf…

MacOS Big Sur 11 新机安装brew wget python3.12 exo

MacOS Big Sur 11,算是很老的系统了&#xff0c;所以装起来有点费劲。 首先安装brew 按照官网的方法&#xff0c;直接执行下面语句即可安装&#xff1a; export HOMEBREW_BREW_GIT_REMOTE"https://githubfast.com" # put your Git mirror of Homebrew/brew here …

python-leetcode-一和零

474. 一和零 - 力扣(LeetCode) 这道题是一个典型的 0-1 背包问题,需要用动态规划(DP)来求解。 解题思路 1. 定义状态 设 dp[i][j] 表示最多有 i 个 0 和 j 个 1 时,可以获得的最大子集的大小。 2. 状态转移方程 对于 strs 中的每个字符串 s: 计算 s 中 0 和 1 的个数…

【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理

华为w515麒麟芯片版&#xff0c;还有非麒麟芯片版本&#xff0c;是一款信创电脑&#xff0c;一般安装的UOS系统。 准备一个空U盘&#xff0c;先下载镜像文件及启动盘制作工具&#xff0c;连接如下&#xff1a; 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…

安卓免费工具:海量素材助力个性化头像制作

软件介绍 今天要给大家介绍的软件是DIY头像生成&#xff0c;这是一款超有创意的头像制作工具&#xff0c;可在安卓系统使用&#xff0c;而且它完全免费。 在使用手机的过程中&#xff0c;大家肯定都想拥有一个独特又好看的头像。DIY头像生成就能满足这个需求&#xff0c;它内…

K8S高可用集群-小白学习之二进制部署(ansible+shell)

一.K8S高可用集群配置概述 序言:本文从一个小白的视角进行K8S的研究和部署,采用二进制的方式是为了更清楚了分解部署流程及了解这个集群是怎么运作的,加上ansible+shell是方便在这个过程中,遇到了问题,我们可以不断的快速重复部署来测试和研究问题的所在点,本文的架构图…

数据库系统概论(一)详细介绍数据库与基本概念

数据库系统概论&#xff08;一&#xff09;介绍数据库与基本概念 前言一、什么数据库1.数据库的基本概念2.数据库的特点 二、数据库的基本概念1. 数据2. 数据库3.数据库管理系统4.数据库系统 三、数据管理技术的产生和发展四、数据库系统的特点1.数据结构化2.数据共享性3.数据冗…

threejs:着色器onBeforeCompile给导入的模型添加光带扫描效果

模型材质属性丢失 上一篇博客我们学习了用着色器给模型添加光带扫描效果&#xff0c;今天来学习给导入的模型添加光带扫描效果&#xff0c;目标是给如下图的立筒仓加光带扫描。 首先我们试试原来的方法还是否有效。 import * as THREE from three;// 引入gltf模型加载库GLTFL…

Python----数据分析(Matplotlib五:pyplot的其他函数,Figure的其他函数, GridSpec)

一、pyplot的其他函数 1.1、xlabel 在matplotlib中&#xff0c; plt.xlabel() 函数用于为当前活动的坐标轴&#xff08;Axes&#xff09;设置x轴的 标签。当你想要标识x轴代表的数据或单位时&#xff0c;这个函数非常有用。 plt.xlabel(xlabel text) 1.2、ylabel 在matplotl…

基于GeoTools的GIS专题图自适应边界及高宽等比例生成实践

目录 前言 一、原来的生成方案问题 1、无法自动读取数据的Bounds 2、专题图高宽比例不协调 二、专题图生成优化 1、直接读取矢量数据的Bounds 2、专题图成果抗锯齿 3、专题成果高宽比例自动调节 三、总结 前言 在当今数字化浪潮中&#xff0c;地理信息系统&#xff08;…

aardio - 虚表 + 数据库 操作例程

import godking.vlistEx; import fonts.fontAwesome import win.ui; /*DSG{{*/ mainForm win.form(text"客户信息管理";right967;bottom556;border"none") mainForm.add( addData{cls"plus";text\uF067 新增;left8;top80;right77;bottom110;bgc…

SQLAlchemy系列教程:理解SQLAlchemy元数据

SQLAlchemy是Python开发人员的强大ORM工具。SQLAlchemy中的元数据是对象-关系映射配置的集合&#xff0c;允许开发人员无缝地定义和使用数据库模式。 使用元数据 SQLAlchemy中的元数据充当各种数据库描述符&#xff08;如表、列和索引&#xff09;的容器。这使开发人员能够通…

Soul 1.4.60 | 清爽版浏览器,内置广告拦截与多功能集成,保护隐私

Soul浏览器是一款专注于内容浏览体验的安卓浏览器&#xff0c;去除广告与追踪器&#xff0c;集成视频下载、PDF查看、手势控制等实用功能。支持无痕模式与黑暗主题&#xff0c;内置清洁器自动过滤广告&#xff0c;优化网页加载速度&#xff0c;提供流畅的浏览体验与隐私保护。支…