Dom的学习

DOM(文档对象模型,Document Object Model)是一个编程接口,用于HTML和XML文档。它将文档表示为一个树形结构,其中每个节点都是文档的一部分,例如元素、属性和文本内容。通过DOM,开发者可以使用编程语言(如JavaScript)来动态访问和更新文档的内容、结构和样式。

示例:

<!DOCTYPE html>
<html>
<head><title>示例</title>
</head>
<body><h1>欢迎</h1><p>这是一个示例文档。</p>
</body>
</html>

在DOM中,这个文档的结构可以表示为: 

一、查找 

 1、getElementById()
getElementById()通过id获取元素 获取符合条件的第一个对象

例如:

<body><div id="aaa">点击我</div><div id="aa">点击我也可以</div>
</body>

js

window.onload = function() {var obja = document.getElementById("aaa");console.log(obja);if (obja) { // 检查 obja 是否为 nullobja.onclick = function() {alert("Element aaa clicked!");};}var objb = document.getElementById("aa");console.log(objb);if (objb) { // 检查 objb 是否为 nullobjb.onclick = function() {alert("Element aa clicked!");};}
};

2、getElementsByClassName()
getElementsByClassName("aa")根据元素名称查找  找到所有符合条件的对象组成的数组
    <div class="aa">点击我 1</div><div class="aa">点击我 2</div><div class="aa">点击我 3</div>
js
window.onload = function() {// 获取所有具有类名 "aa" 的元素var elements = document.getElementsByClassName("aa");console.log(elements); for (let i = 0; i < elements.length; i++) {elements[i].onclick = function() {console.log("Element " + (i + 1) + " clicked!"); };
}
};

3、getElementsByTagName()
根据元素名称查找  找到所有符合条件的对象组成的数组
var arr = document.getElementsByTagName("div")
    <div>这是第一个 DIV</div><div>这是第二个 DIV</div><div>这是第三个 DIV</div>
js
window.onload = function() {// 获取所有具有类名 "aa" 的元素var elements = document.getElementsByTagName("div");console.log(elements); for (let i = 0; i < elements.length; i++) {elements[i].onclick = function() {console.log("Element " + (i + 1) + " clicked!"); };
}
};

4、querySelector()
根据元素选择器查找 querySelector()获取符合条件的第一个对象
var obj = document.querySelector(".aa")
    <div class="aa">第一个符合条件的对象</div><div class="aa">第二个符合条件的对象</div><div class="bb">另一个对象</div>
js
window.onload = function() {// 使用 querySelector 获取第一个具有类名 "aa" 的元素var obj = document.querySelector(".aa");// 检查 obj 是否存在if (obj) {console.log("找到的对象内容: " + obj.textContent);// 可以对找到的元素进行操作,例如修改样式obj.style.backgroundColor = "yellow"; // 给找到的对象添加背景色} else {console.log("没有找到符合条件的对象");}
}

5、 querySelectorAll()
根据元素选择器查找 querySelectorAll()找到所有符合条件的对象组成的数组
var arr = document.querySelectorAll(".aa")
    <div class="aa">第一个符合条件的对象</div><div class="aa">第二个符合条件的对象</div><div class="bb">另一个对象</div><div class="aa">第三个符合条件的对象</div>
js
window.onload = function() {// 使用 querySelectorAll 获取所有具有类名 "aa" 的元素var arr = document.querySelectorAll(".aa");// 遍历 NodeList 并输出每个元素的内容arr.forEach(function(element) {console.log("找到的对象内容: " + element.textContent);});
}

二、通过关系查找 

1、找父亲 parentNode   parentElement
<div class="parent"><div class="child">这是子元素</div></div>
js
window.onload = function() {// 获取子元素var childElement = document.querySelector(".child");// 使用 parentNode 获取父节点var parentNode = childElement.parentNode;console.log("parentNode: ", parentNode); // 输出父节点// 使用 parentElement 获取父元素var parentElement = childElement.parentElement;console.log("parentElement: ", parentElement); // 输出父元素// 检查 parentNode 和 parentElement 是否相同if (parentNode === parentElement) {console.log("parentNode 和 parentElement 是相同的节点。");} else {console.log("parentNode 和 parentElement 是不同的节点。");}
}

2、找孩子 childNodes  children 
<div class="parent"><div class="child">这是子元素1</div><div class="child">这是子元素2</div></div>
js
window.onload = function() {// 获取父元素var parentElement = document.querySelector(".parent");// 使用 childNodes 获取所有子节点var allChildNodes = parentElement.childNodes;console.log("所有子节点 (childNodes):");allChildNodes.forEach(function(node) {console.log(node); // 打印每个子节点});// 使用 children 获取元素子节点var elementChildren = parentElement.children;console.log("所有子元素 (children):");Array.from(elementChildren).forEach(function(child) {console.log(child); // 打印每个子元素});
}

 3、第一个孩子 firstChild firstElementChild
<div class="parent"><div class="child">这是子元素1</div><div class="child">这是子元素2</div></div>
js
window.onload = function() {// 获取父元素var parentElement = document.querySelector(".parent");// 使用 firstChild 获取第一个子节点var firstChild = parentElement.firstChild;console.log("第一个子节点 (firstChild):", firstChild); // 输出第一个子节点(可能是文本节点或注释)// 使用 firstElementChild 获取第一个元素子节点var firstElementChild = parentElement.firstElementChild;console.log("第一个元素子节点 (firstElementChild):", firstElementChild); // 输出第一个元素子节点
}

4、最后一个孩子 lastChild  lastElementChild 
// 获取父元素var parentElement = document.querySelector(".parent");// 使用 lastChild 获取最后一个子节点var lastChild = parentElement.lastChild;console.log("最后一个子节点 (lastChild):", lastChild); // 可能是注释或文本节点// 使用 lastElementChild 获取最后一个元素子节点var lastElementChild = parentElement.lastElementChild;console.log("最后一个元素子节点 (lastElementChild):", lastElementChild); // 输出最后一个元素子节点

5、上一个元素 previousSibling  previousElementSibling
// 获取第三个元素var thirdElement = document.querySelector(".container .item:nth-child(3)");// 使用 previousSibling 获取上一个兄弟节点var previousSibling = thirdElement.previousSibling;if (previousSibling) {console.log("上一个兄弟节点 (previousSibling):", previousSibling);console.log("上一个兄弟节点的内容:", previousSibling.textContent || "没有内容");} else {console.log("没有上一个兄弟节点 (previousSibling)");}// 使用 previousElementSibling 获取上一个元素兄弟节点var previousElementSibling = thirdElement.previousElementSibling;if (previousElementSibling) {console.log("上一个元素兄弟节点 (previousElementSibling):", previousElementSibling);console.log("上一个元素兄弟节点的内容:", previousElementSibling.textContent);} else {console.log("没有上一个元素兄弟节点 (previousElementSibling)");}

6、下一个元素  nextSibling nextElementSibling
window.onload = function() {// 获取第二个元素var secondElement = document.querySelector(".container .item:nth-child(2)");// 使用 nextSibling 获取下一个兄弟节点var nextSibling = secondElement.nextSibling;if (nextSibling) {console.log("下一个兄弟节点 (nextSibling):", nextSibling);} else {console.log("没有下一个兄弟节点 (nextSibling)");}// 使用 nextElementSibling 获取下一个元素兄弟节点var nextElementSibling = secondElement.nextElementSibling;if (nextElementSibling) {console.log("下一个元素兄弟节点 (nextElementSibling):", nextElementSibling);console.log("下一个元素兄弟节点的内容:", nextElementSibling.textContent);} else {console.log("没有下一个元素兄弟节点 (nextElementSibling)");}
};

三、修改 

1、改内容  

 innerText以文本形式呈现   innerHTML解析成标签   value收集用户信息的标签

<div id="box"><div id="div1" class="mr"><p>萌萌</p></div><div  id="div2" class="mr"><p>明明</p></div></div>
js
window.onload = function() {const div1=document.getElementById('div1')const div2=document.getElementById('div2')console.log(div1.innerText)console.log(div2.innerHTML)}

value 修改用户信息

 <h2>用户信息收集</h2><form id="userInfoForm"><label for="name">姓名:</label><input type="text" id="name" name="name" required><br><br><label for="email">电子邮件:</label><input type="email" id="email" name="email" required><br><br><button type="submit">提交</button>
js
window.onload = function() {document.getElementById("userInfoForm").onsubmit = function(event) {event.preventDefault(); // 阻止默认提交行为// 收集用户输入的信息var name = document.getElementById("name").value;var email = document.getElementById("email").value;// 输出收集到的信息console.log("姓名:", name);console.log("电子邮件:", email);};
}

2、改属性

原生属性 对象.属性=值

<button id="myButton" class="old-class">点击我</button>
js
window.onload = function() {// 获取按钮元素var obj = document.getElementById("myButton");// 输出原来的 idconsole.log("原来的 id:", obj.id);// 改变 id 和 classNameobj.id = '77';obj.className = 'new-class';// 添加点击事件obj.onclick = function() {alert("按钮被点击了!");};// 输出新的 id 和 classNameconsole.log("新的 id:", obj.id);console.log("新的 className:", obj.className);
}

自定义属性

<div id="myDiv" data-fruit="banana">这是一个示例666</div>
js// 获取 div 元素var obj = document.getElementById("myDiv");// 获取自定义属性console.log("原来的自定义属性 data-fruit:", obj.getAttribute("data-fruit"));// 设置新的自定义属性obj.setAttribute("data-eat", "apple");// 输出更新后的自定义属性console.log("新的自定义属性 data-eat:", obj.getAttribute("data-eat"));

 

3、改样式
    <style>/* 初始样式 */#myDiv {width: 300px;height: 100px;border: 1px solid black;text-align: center;margin-bottom: 20px;line-height: 100px; /* 使文本垂直居中 */}</style>
</head>
<body><div id="myDiv" data-fruit="banana">这是一个示例666</div>
</body>
利用js进行修改
// 获取 div 元素var obj = document.getElementById("myDiv");// 改变样式属性obj.style.background = 'red';  // 改变背景颜色obj.style.color = 'blue';      // 改变文本颜色obj.style.fontSize = '50px';   // 改变字体大小

 

修改后

四、添加 

1、创建元素
    <h2>现有列表</h2><ul><li>项目 1</li><li>项目 2</li><li>项目 3</li></ul><button id="addElementBtn">添加新元素</button><button id="cloneElementBtn">复制列表</button><div id="output"></div>
js// 添加新元素的功能document.getElementById("addElementBtn").onclick = function() {var newNode = document.createElement("h1");newNode.innerText = "新添加的元素";newNode.className = "xixi";newNode.style.background = "purple";// 将新元素添加到输出区域document.getElementById("output").appendChild(newNode);console.log(newNode);};// 复制现有列表的功能document.getElementById("cloneElementBtn").onclick = function() {var oldNode = document.querySelector("ul");var newNode = oldNode.cloneNode(true); // 复制整个列表,包括子元素newNode.style.backgroundColor = "lightgray"; // 为复制的列表添加背景色// 将复制的列表添加到输出区域document.getElementById("output").appendChild(newNode);console.log(newNode);};

2、添加元素 

       <h2>我的列表</h2><ul id="myList"><li>项目 1</li><li>项目 2</li><li>项目 3</li></ul><button id="addBtn">添加新项目</button><button id="insertBtn">在项目 2 前插入新项目</button><button id="replaceBtn">替换项目 3</button>js
// 获取列表元素
var obj = document.getElementById("myList");// 添加新项目的功能
document.getElementById("addBtn").onclick = function() {var newNode = document.createElement("li");newNode.innerText = "新添加的项目";obj.appendChild(newNode); // 在列表最后添加新项目
};// 在项目 2 前插入新项目的功能
document.getElementById("insertBtn").onclick = function() {var newNode = document.createElement("li");newNode.innerText = "插入的项目";var h4 = obj.children[1]; // 获取项目 2obj.insertBefore(newNode, h4); // 在项目 2 前插入新项目
};// 替换项目 3 的功能
document.getElementById("replaceBtn").onclick = function() {var newNode = document.createElement("li");newNode.innerText = "替换后的项目";var h4 = obj.children[2]; // 获取项目 3obj.replaceChild(newNode, h4); // 替换项目 3
};

五、删除

    <h2>我的列表</h2><ul id="myList"><li>项目 1 <button class="deleteBtn">删除</button></li><li>项目 2 <button class="deleteBtn">删除</button></li><li>项目 3 <button class="deleteBtn">删除</button></li></ul>
js// 删除项的功能var list = document.getElementById("myList");// 为所有删除按钮添加事件监听器var deleteButtons = document.querySelectorAll(".deleteBtn");deleteButtons.forEach(function(button) {button.onclick = function() {// 获取要删除的列表项var listItem = button.parentNode; // button 的父节点是 lilist.removeChild(listItem); // 使用列表的 removeChild 方法删除// 或者使用: listItem.parentNode.removeChild(listItem);};});

 

附上一张网上的参考资料

 

参考链接:DOM操作精要-CSDN博客

 

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

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

相关文章

游戏行业销售数据分析可视化

完整源码项目包获取→点击文章末尾名片&#xff01; &#x1f31f;分析&#xff1a; 可看出最近五年用户最喜爱的游戏类型依然还是Action-动作类&#xff08;当然市场发行的也很多&#xff09; Sports-运动类和Shooter-射击类顺序互换,但我估计现在大环境局势紧张可以会推动射击…

Golang Gin系列-4:Gin Framework入门教程

在本章中&#xff0c;我们将深入研究Gin&#xff0c;一个强大的Go语言web框架。我们将揭示制作一个简单的Gin应用程序的过程&#xff0c;揭示处理路由和请求的复杂性。此外&#xff0c;我们将探索基本中间件的实现&#xff0c;揭示精确定义路由和路由参数的技术。此外&#xff…

靠右行驶数学建模分析(2014MCM美赛A题)

笔记 题目 要求分析&#xff1a; 比较规则的性能&#xff0c;分为light和heavy两种情况&#xff0c;性能指的是 a.流量与安全 b. 速度限制等分析左侧驾驶分析智能系统 论文 参考论文 两类规则分析 靠右行驶&#xff08;第一条&#xff09;2. 无限制&#xff08;去掉了第一条…

PyTorch使用教程(11)-cuda的使用方法

1. 基本概念 CUDA&#xff08;Compute Unified Device Architecture&#xff09;是NVIDIA开发的一种并行计算平台和编程模型&#xff0c;专为图形处理器&#xff08;GPU&#xff09;设计&#xff0c;旨在加速科学计算、工程计算和机器学习等领域的高性能计算任务。CUDA允许开发…

金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成

目录 一、投资模块&#xff08;投资接口投资业务&#xff09; 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块&#xff08;投资接口投资业务…

Ubuntu22.04安装paddle GPU版本

文章目录 确立版本安装CUDA与CUDNN安装paddle 确立版本 查看官网信息&#xff0c;确立服务版本&#xff1a;https://www.paddlepaddle.org.cn/documentation/docs/zh/2.6/install/pip/linux-pip.html 安装CUDA与CUDNN 通过nvidia-smi查看当前显卡驱动版本&#xff1a; 通过…

网络编程-UDP套接字

文章目录 UDP/TCP协议简介两种协议的联系与区别Socket是什么 UDP的SocketAPIDatagramSocketDatagramPacket 使用UDP模拟通信服务器端客户端测试 完整测试代码 UDP/TCP协议简介 两种协议的联系与区别 TCP和UDP其实是传输层的两个协议的内容, 差别非常大, 对于我们的Java来说, …

Unity补充 -- 协程相关

1.协程。 协程并不是线程。线程是主线程之外的另一条 代码按照逻辑执行通道。协程则是在代码在按照逻辑执行的同时&#xff0c;是否需要执行额外的语句块。 2.协程的作用。 在update执行的时候&#xff0c;是按照帧来进行刷新的&#xff0c;也是按照帧执行代码的。但是又不想…

IoTDB 常见问题 QA 第四期

关于 IoTDB 的 Q & A IoTDB Q&A 第四期来啦&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;Java 中如何使用 SSL 连接 IoTDB 问题…

Json转换类型报错问题:java.lang.Integer cannot be cast to java.math.BigDecimal

Json转换类型报错问题&#xff1a;java.lang.Integer cannot be cast to java.math.BigDecimal 小坑规避指南 小坑规避指南 项目中遇到json格式转换成Map&#xff0c;已经定义了Map的key和value的类型&#xff0c;但是在遍历Map取值的时候出现了类型转换的报错问题&#xff08…

数据结构——队列和栈(介绍、类型、Java手搓实现循环队列)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

python http server运行Angular 单页面路由时重定向,解决404问题

问题 当Angular在本地ng server运行时候&#xff0c;可以顺利访问各级路由。 但是运行ng build后&#xff0c;在dist 路径下的打包好的额index.html 必须要在服务器下运行才能加载。 在服务器下我们第一次访问路由页面时是没有问题的&#xff0c;但是尝试刷新页面或手动输入路…

SQL表间关联查询详解

简介 本文主要讲解SQL语句中常用的表间关联查询方式&#xff0c;包括&#xff1a;左连接&#xff08;left join&#xff09;、右连接&#xff08;right join&#xff09;、全连接&#xff08;full join&#xff09;、内连接&#xff08;inner join&#xff09;、交叉连接&…

Android Jni(一) 快速使用

文章目录 Android Jni&#xff08;一&#xff09; 快速使用1、 环境配置下载 NDK2、右键 add c to module3、创建一个 native 方法&#xff0c;并更具提示&#xff0c;自动创建对应的 JNI 实现4、实现对应 Jni 方法5、static loadLibrary6、调用执行 遇到的问题1、[CXX1300] CM…

【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局

目录 1 -> 自适应布局 1.1 -> 线性布局 1.1.1 -> 线性布局的排列 1.1.2 -> 自适应拉伸 1.1.3 -> 自适应缩放 1.1.4 -> 定位能力 1.1.5 -> 自适应延伸 1.2 -> 层叠布局 1.2.1 -> 对齐方式 1.2.2 -> Z序控制 1.3 -> 弹性布局 1.3.1…

物联网网关Web服务器--Boa服务器移植与测试

1、Boa服务器介绍 BOA 服务器是一个小巧高效的web服务器&#xff0c;是一个运行于unix或linux下的&#xff0c;支持CGI的、适合于嵌入式系统的单任务的http服务器&#xff0c;源代码开放、性能高。 Boa 嵌入式 web 服务器的官方网站是http://www.boa.org/。 特点 轻量级&#x…

tomcat状态一直是Exited (1)

docker run -di -p 80:8080 --nametomcat001 你的仓库地址/tomcat:9执行此命令后tomcat一直是Exited(1)状态 解决办法&#xff1a; 用以下命令创建运行 docker run -it --name tomcat001 -p 80:8080 -d 你的仓库地址/tomcat:9 /bin/bash最终结果 tomcat成功启动

三天急速通关Java基础知识:Day1 基本语法

三天急速通关JAVA基础知识&#xff1a;Day1 基本语法 0 文章说明1 关键字 Keywords2 注释 Comments2.1 单行注释2.2 多行注释2.3 文档注释 3 数据类型 Data Types3.1 基本数据类型3.2 引用数据类型 4 变量与常量 Variables and Constant5 运算符 Operators6 字符串 String7 输入…

表单中在不设置required的情况下在label前加*必填标识

参考:https://blog.csdn.net/qq_55798464/article/details/136233718 需求&#xff1a;在发票类型前面添加*必填标识 我最开始直接给发票类型这个表单类型添加了验证规则required:true&#xff0c;问题来了&#xff0c;这个发票类型它是有默认值的&#xff0c;所以我点击保存…

2025寒假备战蓝桥杯01---朴素二分查找的学习

文章目录 1.暴力方法的引入2.暴力解法的思考 与改进3.朴素二分查找的引入4.朴素二分查找的流程5.朴素二分查找的细节6.朴素二分查找的题目 1.暴力方法的引入 对于下面的这个有序的数据元素的组合&#xff0c;我们的暴力解法就是挨个进行遍历操作&#xff0c;一直找到和我们的这…