一、DOM基础概念

DOM 是文档对象模型,提供编程接口用于操作 HTML 和 XML 文档。它将文档表示为节点树,每个节点代表文档的一部分,如元素、文本、属性等。通过 DOM,开发者可以访问和修改文档的结构、样式与内容。

文档节点类型

元素节点

对应 HTML 标签,如<div><p>等。

文本节点

包含标签内的文本内容。

属性节点

对应元素的属性,如idclass等。

二、访问DOM元素

通过标签名

getElementsByName返回指定名称的所有元素集合。

const radios = document.getElementsByName("radio");

通过类名

getElementsByClassName返回指定类名的所有元素集合。

const elements = document.getElementsByClassName("example-class");

通过ID

getElementById快速获取指定ID的唯一元素。

const element = document.getElementById("example-id");

CSS选择器方式

querySelector返回匹配指定CSS选择器的第一个元素。

const firstDiv = document.querySelector("div");
const activeElement = document.querySelector(".active");

querySelectorAll返回匹配指定选择器的所有元素的静态节点列表。

const allDivs = document.querySelectorAll("div");
const elementsWithClass = document.querySelectorAll(".example-class");

三、创建和修改DOM元素

创建元素

createElement创建指定标签的新元素。

const newDiv = document.createElement("div");

创建文本节点

createTextNode创建包含指定文本的新文本节点。

const textNode = document.createTextNode("Hello, World!");

添加元素到页面

appendChild将子节点添加到父节点的子节点列表末尾。

parentElement.appendChild(newDiv);

prepend将节点添加到父节点的子节点列表开头。

parentElement.prepend(newDiv);

insertBefore在父节点的指定子节点前插入新子节点。

parentElement.insertBefore(newNode, existingNode);

修改元素内容

直接操作元素的textContent属性来替换文本内容。

element.textContent = "新的文本内容";

或操作innerHTML属性来替换包含HTML标签的内容。

element.innerHTML = "<strong>新的HTML内容</strong>";

修改元素属性

操作className属性修改类名。

element.className = "new-class";

使用setAttribute方法设置指定属性的值。

element.setAttribute("id", "new-id");
element.setAttribute("data-custom", "value");

使用getAttribute方法获取指定属性的值。

const value = element.getAttribute("data-custom");

四、删除DOM元素

删除子节点

removeChild从父节点中移除指定的子节点。

parentElement.removeChild(childElement);

元素的remove方法

remove移除元素自身。

element.remove();

五、DOM事件处理

添加事件监听器

addEventListener为元素添加指定类型的事件监听器。

element.addEventListener("click", function(event) {console.log("点击事件触发");
});

事件对象

事件处理函数接收事件对象作为参数,包含事件相关的信息和方法。

element.addEventListener("click", function(event) {console.log(event.type); // 输出 "click"console.log(event.target); // 输出被点击的元素
});

阻止默认行为

调用事件对象的preventDefault方法可阻止事件的默认行为。

const link = document.querySelector("a");
link.addEventListener("click", function(event) {event.preventDefault();console.log("链接点击默认行为被阻止");
});

停止事件传播

调用事件对象的stopPropagation方法可阻止事件冒泡。

const childElement = document.querySelector(".child");
childElement.addEventListener("click", function(event) {event.stopPropagation();console.log("子元素点击事件");
});
const parentElement = document.querySelector(".parent");
parentElement.addEventListener("click", function(event) {console.log("父元素点击事件");
});

六、DOM操作实践案例

动态更新页面内容

根据用户选择动态更新商品信息展示。

<div id="product-info"><h2 id="product-title">商品标题</h2><p id="product-price">商品价格</p><button id="add-to-cart">加入购物车</button>
</div><script>const productData = {title: "智能手机",price: "2999元"};document.getElementById("product-title").textContent = productData.title;document.getElementById("product-price").textContent = productData.price;document.getElementById("add-to-cart").addEventListener("click", function() {alert(`${productData.title} 已加入购物车`);});
</script>

表单验证

实时验证表单输入内容,增强用户体验。

<form id="register-form"><input type="text" id="username" placeholder="请输入用户名"><span id="username-error" class="error-message"></span><button type="submit">注册</button>
</form><script>const usernameInput = document.getElementById("username");const usernameError = document.getElementById("username-error");const registerForm = document.getElementById("register-form");function validateUsername() {const username = usernameInput.value.trim();if (username.length < 3) {usernameError.textContent = "用户名至少3个字符";return false;} else {usernameError.textContent = "";return true;}}usernameInput.addEventListener("input", validateUsername);registerForm.addEventListener("submit", function(event) {if (!validateUsername()) {event.preventDefault();}});
</script>

DOM操作性能优化

在更新大量列表数据时,使用文档片段提升性能。

<ul id="items-list"></ul><script>const itemsList = document.getElementById("items-list");const fragment = document.createDocumentFragment();for (let i = 0; i < 1000; i++) {const li = document.createElement("li");li.textContent = `项目 ${i + 1}`;fragment.appendChild(li);}itemsList.appendChild(fragment);
</script>

七、总结

DOM 是前端开发的核心,熟练掌握 DOM 操作对构建动态、交互丰富的网页至关重要。本文详细介绍了访问、创建、修改、删除 DOM 元素,以及处理事件的方法,并提供了实践案例。不断练习和探索,你将能够高效地运用 DOM 操作,打造出色的前端应用。

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

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

相关文章

AWS CloudFormation深度解析:构建现代云原生应用基础设施

在现代云原生应用开发中,基础设施即代码(Infrastructure as Code, IaC)已成为标准实践。本文将深入解析一个完整的AWS CloudFormation模板,该模板为GlowChat Connector应用构建了生产级的基础设施。 模板概述 这个CloudFormation模板是一个两部分部署架构中的第一部分,专…

Oracle 查看所有表的字段名、数据类型及长度

1.只查看某个特定表的字段名 SELECT column_name, data_type, data_length FROM user_tab_columns WHERE table_name 你的表名 -- 注意大写 ORDER BY column_id;2.查看当前用户下所有表的字段名 SELECT table_name, column_name, data_type, data_length FROM user_tab_colu…

创客匠人分享知识付费监管升级下的行业价值重构:从合规挑战到发展机遇的实践路径

引言&#xff1a;监管政策背后的行业逻辑转向 知识付费领域的监管体系升级&#xff0c;本质上是对行业发展路径的重新校准。随着 "内容产品需具备知识沉淀载体" 等新规落地&#xff0c;行业正在经历从 "流量驱动型增长" 到 "价值驱动型发展" 的…

边缘计算的认识和应用

边缘计算 边缘计算是一种分布式计算范式&#xff0c;它将计算能力和数据存储放置在离数据源更近的位置&#xff0c;而不是依赖于集中式的数据中心。通过在“边缘”进行数据处理&#xff0c;边缘计算可以减少延迟、提高响应速度、节省带宽&#xff0c;并增强数据隐私和安全性。…

Arduino R4 WIFI横向滚动显示16×16LED屏

实现一个从左向右横向滚动的"吉祥如意"显示效果。 arduino r4 WiFi滚动显示16*16led #include <SPI.h>// 引脚定义 const int RowA 2, RowB 3, RowC 4, RowD 5; const int OE 6; const int LATCH 10;// 字模数据 (吉祥如意) const PROGMEM byte characte…

html css js网页制作成品——HTML+CSS+js力学光学天文网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…

嵌入式开发之freeRTOS移植

FreeRTOS 是一款广泛应用于嵌入式系统的开源实时操作系统&#xff08;RTOS&#xff09;&#xff0c;其移植过程需要结合具体硬件平台和编译器进行适配。以下是 FreeRTOS 移植的详细步骤和关键注意事项&#xff1a; 一、移植前的准备工作 1. 硬件平台确认 处理器架构&#xf…

【算法 day07】LeetCode 344.反转字符串 | 541. 反转字符串II | 卡码网:54.替换数字

344.反转字符串 题目链接 | 文档讲解 |视频讲解 : 链接 1.思路&#xff1a; 采用双指针&#xff0c;left从0开始移动,right从尾元素进行移动 循环判断条件&#xff1a;left< right,边界值使用举例法&#xff0c;eg: [ h ,e ,l,o ]偶数个不会相遇, [h ,e ,l ,l ,o ]奇数个&…

从检索到生成:RAG 如何重构大模型的知识边界?

引言&#xff1a;知识边界的突破与重构 在人工智能技术快速发展的今天&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已经展现出强大的文本生成和理解能力。然而&#xff0c;这些模型在实际应用中仍面临着知识时效性、事实准确性和可溯源性等核心挑战。检索增强生成&a…

前端基础知识CSS系列 - 05(BFC的理解)

一、是什么 我们在页面布局的时候&#xff0c;经常出现以下情况&#xff1a; 这个元素高度怎么没了&#xff1f;这两栏布局怎么没法自适应&#xff1f;这两个元素的间距怎么有点奇怪的样子&#xff1f;...... 原因是元素之间相互的影响&#xff0c;导致了意料之外的情况&…

Prompt Engineering 学习指南:从入门到精通的最佳路径与资源

本 Prompt Engineering 技术报告,旨在提供一个从入门到精通的清晰学习路径、核心方案,并附上最关键的 GitHub 仓库资源。您可以将此报告作为快速提升 Prompt 能力的“速查手册”和“成长地图”。 Prompt Engineering 学习指南:从入门到精通的最佳路径与资源 技术报告摘要 (…

fastmcp MCPConfig多服务器使用案例;sse、stdio、streamable-http使用

1、sse、stdio、streamable-http使用 参考&#xff1a;https://gofastmcp.com/deployment/running-server#the-run-method stdio本地使用&#xff1b;sse、streamable-http远程调用&#xff08; Streamable HTTP—New in version: 2.3.0&#xff09; 调用&#xff1a; stdio、…

网站服务器被DDOS攻击打不开,是要换高防服务器还是加CDN能防护住?

高防云服务器、高防 IP 和高防 CDN 作为常见应对网络攻击的重要利器&#xff0c;它们各自有着独特的特点和应用场景&#xff0c;从技术架构看&#xff0c;高防云服务器是资源型防护&#xff0c;深度整合计算与防御资源&#xff1b;高防IP是流量型防护&#xff0c;以代理模式实现…

深入解析原型模式:从理论到实践的全方位指南

深入解析原型模式&#xff1a;从理论到实践的全方位指南 引言&#xff1a;为什么需要原型模式&#xff1f; 在软件开发过程中&#xff0c;对象创建是一个频繁且关键的操作。传统方式&#xff08;如直接使用new关键字&#xff09;在某些场景下会显得效率低下且不够灵活。想象这…

HuggingFace镜像配置失效问题深度解析:Python模块导入机制的陷阱

前言 在使用HuggingFace的transformers和datasets库时&#xff0c;国内用户经常会遇到网络连接问题。虽然设置了镜像源环境变量&#xff0c;但仍然报错无法连接到huggingface.co。本文将深入分析这个问题的根因&#xff0c;并从Python模块导入机制的角度解释为什么环境变量设置…

leetcode146-LRU缓存

leetcode 146 思路 什么是LRU缓存&#xff1f; LRU&#xff08;Least Recently Used&#xff09;缓存是一种常见的缓存淘汰策略&#xff0c;核心思想是&#xff1a;当缓存容量满时&#xff0c;优先淘汰最久未使用的数据。LeetCode 146 题要求实现一个支持get和put操作的 LR…

MQTT:构建高效物联网通信的轻量级协议

MQTT – 轻量级物联网消息推送协议 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用&#xf…

AI自动生成复杂架构图,流程图,思维导图

AI自动生成复杂架构图&#xff0c;流程图&#xff0c;思维导图方案 1. 背景 在我们自己去绘制架构图&#xff0c;流程图&#xff0c;思维导图的时候&#xff0c;我们通常需要花费大量的时间去绘制。 目前的一些直接生图的模型也只能生成简单的流程图&#xff0c;不能生成复杂…

129. 求根节点到叶节点数字之和 --- DFS +回溯(js)

129. 求根节点到叶节点数字之和 --- DFS 回溯&#xff08;js&#xff09; 题目描述解题思路完整代码 题目描述 129. 求根节点到叶节点数字之和 解题思路 和 257. 二叉树的所有路径&#xff08;js&#xff09; 是一样的思路。 不一样的地方就是遇到叶子节点的时候把路径拼接…

SpringBoot电脑商城项目--修改默认收货地址

1. 修改默认收货地址-持久层 1.1 规划sql语句 检测当前用户向设置为默认收货地址的这条数据是否存在 SELECT * FROM t_address WHERE aid#{aid} 在修改用户的收获默认地址之前&#xff0c;先将所有的收货地址设置为非默认 UPDATE t_address SET is_default0 WHERE uid#{uid} …