DOM 操作入门:HTML 元素操作与页面事件处理

DOM 操作入门:HTML 元素操作与页面事件处理

  • DOM 操作入门:HTML 元素操作与页面事件处理
    • 什么是 DOM?
    • 1. 如何操作 HTML 元素?
      • 1.1 使用 `document.getElementById()` 获取单个元素
      • 1.2 使用 `document.querySelector()` 和 `document.querySelectorAll()` 获取多个元素
      • 1.3 创建和删除 HTML 元素
      • 1.4 修改 HTML 属性和样式
    • 2. 如何处理页面事件?
      • 2.1 常见的事件类型
      • 2.2 使用 `addEventListener()` 绑定事件
      • 2.3 处理表单提交事件
      • 2.4 使用 `removeEventListener()` 解除事件监听
    • 3. 高级技巧
      • 3.1 DOM 操作的性能优化
      • 3.2 使用 MutationObserver 监视 DOM 变化
    • 总结

DOM 操作入门:HTML 元素操作与页面事件处理

在现代 web 开发中,DOM(文档对象模型)操作是前端开发者必须掌握的核心技能。无论是修改 HTML 结构、操作 CSS 样式还是处理用户交互事件,都需要通过 DOM 来实现。对于刚接触前端开发的新手来说,理解 DOM 操作可能会显得有些复杂,但只要掌握了基本概念和常用方法,就能轻松上手。


什么是 DOM?

DOM(Document Object Model)是 web 文档的标准接口。它将 HTML 和 XML 文档表示为对象的层次结构,使得开发者可以通过 JavaScript 来操作网页内容、样式和结构。

简单来说,DOM 允许我们在 JavaScript 中访问和修改 HTML 元素及其属性,并且可以对页面事件进行监听和处理。

通过 DOM,我们可以实现动态网页效果,比如响应用户交互、更新页面内容等。


1. 如何操作 HTML 元素?

在 JavaScript 中,最常见的任务之一就是操作 DOM。要操作某个元素,首先需要找到它。DOM 提供了许多方法来选择元素,包括以下几种方式:

1.1 使用 document.getElementById() 获取单个元素

document.getElementById() 方法用于通过元素的 ID 属性获取单个 HTML 元素。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>DOM 操作入门</title>
</head>
<body>
    <h1 id="mainTitle">欢迎学习 DOM 操作!</h1>
    <script>
        // 通过 ID 获取元素
        const title = document.getElementById('mainTitle');
        console.log(title); // 输出: <h1>欢迎学习 DOM 操作!</h1>
        
        // 修改元素内容
        title.textContent = 'DOM 操作很简单!';
    </script>
</body>
</html>

1.2 使用 document.querySelector()document.querySelectorAll() 获取多个元素

querySelector() 方法用于通过 CSS 选择器获取单个匹配的元素,而 querySelectorAll() 则返回所有匹配的元素集合。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>DOM 操作入门</title>
</head>
<body>
    <div class="container">
        <p id="para1">第一个段落。</p>
        <p id="para2">第二个段落。</p>
        <p id="para3">第三个段落。</p>
    </div>
    
    <script>
        // 通过 CSS 选择器获取元素
        const para = document.querySelector('.container p');
        console.log(para); // 输出: 第一个匹配的 <p> 元素
        
        // 获取多个元素
        const paras = document.querySelectorAll('.container p');
        paras.forEach(p => {
            console.log(p.textContent);
        });
    </script>
</body>
</html>

1.3 创建和删除 HTML 元素

使用 document.createElement() 方法可以创建新的 HTML 元素,而 removeChild() 方法则用于删除元素。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>DOM 操作入门</title>
</head>
<body>
    <div id="container"></div>
    
    <script>
        const container = document.getElementById('container');
        
        // 创建新元素
        const newDiv = document.createElement('div');
        newDiv.textContent = '这是一个新的 div 元素';
        container.appendChild(newDiv); // 将新元素添加到容器中
        
        // 删除最后一个子节点
        setTimeout(() => {
            const lastChild = container.lastChild;
            container.removeChild(lastChild);
            console.log('已删除最后一个子节点');
        }, 2000);
    </script>
</body>
</html>

1.4 修改 HTML 属性和样式

通过 DOM,我们可以轻松修改元素的属性和样式。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>DOM 操作入门</title>
    <style>
        .highlight {
            color: red;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <h1 id="title">页面标题</h1>
    
    <script>
        // 修改元素的属性
        const title = document.getElementById('title');
        title.textContent = '新的标题';
        title.style.color = '#ff0000'; // 修改样式
        
        // 添加类名
        setTimeout(() => {
            title.classList.add('highlight');
            console.log('已添加 highlight 类');
        }, 1000);
    </script>
</body>
</html>

2. 如何处理页面事件?

DOM 的另一个重要功能是处理页面交互。通过 DOM,我们可以为 HTML 元素绑定事件监听器,并在用户操作时执行相应的代码。

2.1 常见的事件类型

  • 鼠标事件clickdblclickmouseovermouseout
  • 键盘事件keydownkeyup
  • 表单事件submitinput
  • 拖拽事件dragstartdragenddrop

2.2 使用 addEventListener() 绑定事件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>DOM 操作入门</title>
</head>
<body>
    <button id="clickMe">点击我!</button>
    
    <script>
        const button = document.getElementById('clickMe');
        
        // 绑定 click 事件
        button.addEventListener('click', function() {
            console.log('按钮被点击了!');
            alert('感谢你的点击!');
        });
        
        // 绑定 mouseover 事件
        button.addEventListener('mouseover', function() {
            this.style.backgroundColor = '#ff0000';
        });
        
        // 绑定mouseout 事件
        button.addEventListener('mouseout', function() {
            this.style.backgroundColor = '#3498db';
        });
    </script>
</body>
</html>

2.3 处理表单提交事件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>DOM 操作入门</title>
</head>
<body>
    <form id="myForm">
        <input type="text" id="username" placeholder="请输入用户名">
        <button type="submit">提交</button>
    </form>
    
    <script>
        const form = document.getElementById('myForm');
        
        // 绑定 submit 事件
        form.addEventListener('submit', function(e) {
            e.preventDefault(); // 阻止表单默认提交行为
            
            const username = document.getElementById('username').value;
            if (username.trim() === '') {
                alert('用户名不能为空!');
                return false;
            }
            
            console.log('正在提交数据...');
            alert('提交成功!');
        });
    </script>
</body>
</html>

2.4 使用 removeEventListener() 解除事件监听

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>DOM 操作入门</title>
</head>
<body>
    <button id="clickMe">点击我!</button>
    
    <script>
        const button = document.getElementById('clickMe');
        
        // 绑定 click 事件
        function handleClick() {
            console.log('按钮被点击了!');
        }
        
        button.addEventListener('click', handleClick);
        
        // 解除事件监听
        setTimeout(() => {
            button.removeEventListener('click', handleClick);
            console.log('已解除 click 事件监听');
        }, 3000);
    </script>
</body>
</html>

3. 高级技巧

3.1 DOM 操作的性能优化

  • 使用 querySelectorAll() 获取所有元素,而不是多次调用 querySelector()
  • 尽量避免频繁操作 DOM,可以使用批量更新的方式
  • 使用事件委托来减少事件监听的数量
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>DOM 操作入门</title>
</head>
<body>
    <div class="container">
        <button class="btn">按钮1</button>
        <button class="btn">按钮2</button>
        <button class="btn">按钮3</button>
    </div>
    
    <script>
        const container = document.querySelector('.container');
        
        // 使用事件委托
        container.addEventListener('click', function(e) {
            const btn = e.target.classList.contains('btn') ? e.target : null;
            if (btn) {
                console.log('按钮被点击了:', btn.textContent);
            }
        });
    </script>
</body>
</html>

3.2 使用 MutationObserver 监视 DOM 变化

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>DOM 操作入门</title>
</head>
<body>
    <div id="target"></div>
    
    <script>
        const target = document.getElementById('target');
        
        // 创建 MutationObserver 实例
        const observer = new MutationObserver(mutations => {
            console.log('检测到 DOM 变化:', mutations);
        });
        
        // 配置观察选项
        const options = {
            childList: true, // 观察子节点变化
            attributes: false // 不观察属性变化
        };
        
        // 开始观察目标节点
        observer.observe(target, options);
        
        // 添加新的 div 元素
        setTimeout(() => {
            const newDiv = document.createElement('div');
            newDiv.textContent = '新添加的 div';
            target.appendChild(newDiv);
        }, 1000);
    </script>
</body>
</html>

总结

通过以上内容,你可以看到 DOM 操作在前端开发中的重要性。无论是修改 HTML 结构、样式还是处理用户交互事件,DOM 都是实现这些功能的核心工具。
随着项目复杂度的增加, DOM 变得越来越关键。掌握 DOM 的基本操作和一些高级技巧,将帮助你写出更高效、更可靠的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型深度研究功能:人类认知与创新的新范式

在人工智能迅猛发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;的深度研究功能正在成为重塑人类认知方式的关键力量。这一突破性技术不仅带来了工具层面的革新&#xff0c;更深刻地触及了人类认知能力的本质。本文将从认知科学的角度出发&#xff0c;探讨LLM如何…

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用

文章目录 1. Redis 是什么&#xff1f;它的主要特点是什么&#xff1f;答案&#xff1a;主要特点&#xff1a; 2. Redis 的数据结构有哪些&#xff1f;分别适用于什么场景&#xff1f;答案&#xff1a;keys *命令返回的键顺序 3. Redis 的持久化机制有哪些&#xff1f;它们的优…

基于SpringBoot的物资管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【力扣】53.最大子数组和

AC截图 题目 思路 这道题主要考虑的就是要排除负数带来的负面影响。如果遍历数组&#xff0c;那么应该有如下关系式&#xff1a; currentAns max(prenums[i],nums[i]) pre是之前记录的最大和&#xff0c;如果prenums[i]小于nums[i]&#xff0c;就要考虑舍弃pre&#xff0c;从…

本地部署DeepSeek教程(Mac版本)

第一步、下载 Ollama 官网地址&#xff1a;Ollama 点击 Download 下载 我这里是 macOS 环境 以 macOS 环境为主 下载完成后是一个压缩包&#xff0c;双击解压之后移到应用程序&#xff1a; 打开后会提示你到命令行中运行一下命令&#xff0c;附上截图&#xff1a; 若遇…

代码随想录算法【Day36】

Day36 1049. 最后一块石头的重量 II 思路 把石头尽可能分成两堆&#xff0c;这两堆重量如果相似&#xff0c;相撞后所剩的值就是最小值 若石头的总质量为sum&#xff0c;可以将问题转化为0-1背包问题&#xff0c;即给一个容量为sum/2的容器&#xff0c;如何尽量去凑满这个容…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.28 NumPy+Matplotlib:科学可视化的核心引擎

2.28 NumPyMatplotlib&#xff1a;科学可视化的核心引擎 目录 #mermaid-svg-KTB8Uqiv5DLVJx7r {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KTB8Uqiv5DLVJx7r .error-icon{fill:#552222;}#mermaid-svg-KTB8Uqiv5…

基序和纯度分数的计算

以下对这两个概念的详细解释&#xff1a; 基序 纯度分数 PWM矩阵的来源 为什么会有PWM矩阵&#xff1f; 一个特定的转录因子&#xff08;TF&#xff09;的结合位点的基序&#xff08;motif&#xff09;并不是唯一的。实际上&#xff0c;TF结合位点通常具有一定的序列变异性&a…

Linux下的编辑器 —— vim

目录 1.什么是vim 2.vim的模式 认识常用的三种模式 三种模式之间的切换 命令模式和插入模式的转化 命令模式和底行模式的转化 插入模式和底行模式的转化 3.命令模式下的命令集 光标移动相关的命令 复制粘贴相关命令 撤销删除相关命令 查找相关命令 批量化注释和去…

有用的sql链接

『SQL』常考面试题&#xff08;2——窗口函数&#xff09;_sql的窗口函数面试题-CSDN博客 史上最强sql计算用户次日留存率详解&#xff08;通用版&#xff09;及相关常用函数 -2020.06.10 - 知乎 (zhihu.com) 1280. 学生们参加各科测试的次数 - 力扣&#xff08;LeetCode&…

算法题(57):找出字符串中第一个匹配项的下标

审题: 需要我们根据原串与模式串相比较并找到完全匹配时子串的第一个元素索引&#xff0c;若没有则返回-1 思路&#xff1a; 方法一&#xff1a;BF暴力算法 思路很简单&#xff0c;我们用p1表示原串的索引&#xff0c;p2表示模式串索引。遍历原串&#xff0c;每次遍历都匹配一次…

线性回归原理和算法

线性回归可以说是机器学习中最基本的问题类型了&#xff0c;这里就对线性回归的原理和算法做一个小结。 对于线性回归的损失函数&#xff0c;我们常用的有两种方法来求损失函数最小化时候的θ参数&#xff1a;一种是梯度下降&#xff0c;一种是最小二乘法。 为了防止模型的过拟…

npm知识

npm 是什么 npm 为你和你的团队打开了连接整个 JavaScript 天才世界的一扇大门。它是世界上最大的软件注册表&#xff0c;每星期大约有 30 亿次的下载量&#xff0c;包含超过 600000 个包&#xff08;package&#xff09;&#xff08;即&#xff0c;代码模块&#xff09;。来自…

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(三)

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;贪心算法篇–CSDN博客 文章目录 前言例题1.最优除法2.跳跃游戏23.跳跃游戏14.加油站5.单调递…

什么是物理地址,什么是虚拟地址?

摘要 什么是物理地址&#xff0c;什么是虚拟地址&#xff1f; 如果处理器没有MMU或未启用&#xff0c;CPU执行单元发出的内存地址直接传到芯片引脚上&#xff0c;被内存芯片接受&#xff0c;这称为物理地址&#xff08;Physical Addraress&#xff09; 如果处理器启用了MMU&a…

LabVIEW图片识别逆向建模系统

本文介绍了一个基于LabVIEW的图片识别逆向建模系统的开发过程。系统利用LabVIEW的强大视觉处理功能&#xff0c;通过二维图片快速生成对应的三维模型&#xff0c;不仅降低了逆向建模的技术门槛&#xff0c;还大幅提升了建模效率。 ​ 项目背景 在传统的逆向建模过程中&#xf…

小程序的协同工作与发布

1.小程序API的三大分类 2.小程序管理的概念&#xff0c;以及成员管理两个方面 3.开发者权限说明以及如何维护项目成员 4.小程序版本

Unity 粒子特效在UI中使用裁剪效果

1.使用Sprite Mask 首先建立一个粒子特效在UI中显示 新建一个在场景下新建一个空物体&#xff0c;添加Sprite Mask组件&#xff0c;将其的Layer设置为UI相机渲染的UI层&#xff0c; 并将其添加到Canvas子物体中&#xff0c;调整好大小&#xff0c;并选择合适的Sprite&#xff…

Java设计模式:行为型模式→状态模式

Java 状态模式详解 1. 定义 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式通过将状态需要的行为封装在不同的状态类中&#xff0c;实现对象行为的动态改变。该模式的核心思想是分离不同状态…

中间件的概念及基本使用

什么是中间件 中间件是ASP.NET Core的核心组件&#xff0c;MVC框架、响应缓存、身份验证、CORS、Swagger等都是内置中间件。 广义上来讲&#xff1a;Tomcat、WebLogic、Redis、IIS&#xff1b;狭义上来讲&#xff0c;ASP.NET Core中的中间件指ASP.NET Core中的一个组件。中间件…