DOM对象
DOM概述
官方定义:
DOM是W3C制定的一个规范(标准),(Document Object Model,文档对象模型),是提供了访问和操作网页中各元素的方法,让程序可以动态的修改或改变网页元素的内容、样式、结构。
DOM是W3C制定的一个规范(标准),而这个规范在浏览器中,以对象的形式得以实现。
在 1998 年,W3C 发布了第一级的 DOM 规范,所有的浏览器都执行了这个标准,因此,DOM 的兼容性问题也几乎难觅踪影了
提供了访问HTML文档的方法, 允许开发者通过JS对HTML文档进行增, 删, 改, 查
DOM结构(倒树形结构)
HTML DOM 将 HTML 文档视作树结构。结构图中的每一项称为节点(Node),树状结构叫节点树,结构树反映了各HTML元素之间的层次关系;DOM就通过这种树结构的层次关系,来定位、访问与控制文档中各元素及其内容
DOM按其内容可分为5个部分
-
核心DOM:可以同时操作HTML和XML两种文档的公共的属性和方法。;
-
XMLDOM:针对XML操作的接口,也是一些属性和方法
-
HTML DOM:HTML专用接口,也是一些属性和方法;
-
DOM事件模型:定义DOM能够响应的事件.比如:onclick、onload、onchange;
DOM的结构
HTML DOM 将 HTML 文档视作树结构。结构图中的每一项称为节点(Node),树状结构叫节点树.结构树反映了各HTML元素之间的层次关系。DOM就通过这种树结构的层次关系,来定位、访问与控制文档中各元素及其内容。
DOM节点
根据 DOM,HTML 文档中的每个成分都是一个节点,HTML文档的节点类型有5个:
-
整个文档是一个文档节点 ,它对应的对象是document对象 9
-
每个 HTML 标签是一个元素节点 1 div=null
-
每一个 HTML 属性是一个属性节点 2 属性=属性值
-
包含在 HTML 元素中的文本是文本节点 (它下面不能再有其它子节点) 3 #test=文本
-
注释属于注释节点 8
<a href=”http://www.baidu.com”>百度</a>
节点对象.nodeType
节点对象.nodeName
节点关系
节点彼此间都存在关系。父(parent)、子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
-
除文档节点之外的每个节点都有父节点(parentNode)。 父节点(parentNode):当前节点的上一级元素;
-
大部分元素节点都有子节点。 子节点(childNode):当前节点的下一级元素(1层);
-
当节点分享同一个父节点时,它们就是同辈(同级节点)。
-
节点也可以拥有后代,后代指某个节点的所有子节点,或者这些子节点的子节点
-
节点也可以拥有先辈。先辈是某个节点的父节点,或者父节点的父节点
只要知道一个节点, 按关系找到其它节点
节点信息
节点信息。每个节点都拥有包含着关于节点某些信息的属性。这些属性是:nodeName(节点名称), nodeValue(节点值),nodeType(节点类型)。
节点名称 obj.nodeName
-
nodeName 是只读的
-
元素节点的 nodeName 与标签名相同
-
属性节点的 nodeName 是属性的名称
-
文本节点的 nodeName 永远是 #text 元素节点的文本内容
节点值 obj.nodeValue
-
元素节点的 nodeValue 是 null
-
文本节点的 nodeValue 是 文本自身
-
属性节点的 nodeValue 是 属性的值
节点类型 obj.nodeType
DOM中定义了12种节点类型,有些类型是XML专有的,与HTML相关的节点类型如下图所示。
-
nodeType 是只读的
-
nodeType 属性规定节点的类型
-
元素节点的 nodeType 是 1
-
属性节点的 nodeType 是 2
-
文本节点的 nodeType 是 3
获取节点对象
获取节点
在访问节点树中节点时,起点是document对象。
获取元素节点
document.getElementById("ID")
document.getElementsByTagName("标签名称")
document.getElementsByClassName("类名");
document.getElementsByName("name属性值")
document.querySelector();
document.querySelectorAll();
document.getElementById('ID').getElementsByTagName("标签名称");
// 获取所有奇数选择器
var sel = document.querySelectorAll("ul li:nth-child(odd)");
for(var i=0; i<sel.length;i++){sel[i].style.backgroundColor = 'red';
}
封装 - 获取元素的方式
function $(selector) {return document.querySelector(selector)
}
获取属性
属性节点包括:clsaa,id,style,name等
obj.attributes[0|'id']; //获取对象的所有的属性的集合
obj.getAttribute(“id”); //获取指定属性名的属性值
obj.getAttributeNode(“id”) //从当前元素中通过名称获取属性节点
获取文本节点
var obj=document.getElementById("mydiv");
for(var i=0;i<obj.childNodes.length;i++){if(obj.childNodes[i].nodeType==3){document.write(obj.childNodes[i].nodeType+"<br>");}
}
//注意页面上的回车转行也算一个文本节点
取其他节点 获取父、子和同胞节点对象
-
节点对象.parentNode //父节点
-
节点对象.childNodes //获取子节点
-
节点对象.children //获取元素中的子元素对象,不要文本
-
节点对象.firstChild //获取第一个子节点
-
节点对象.firstElementChild //获取第一个子节点,不要文本
-
节点对象.lastChild //获取最后一个子节点
-
节点对象.lastElementChild //获取最后一个子节点,不要文本
-
节点对象.previousSibling //获取前一个兄弟元素节点
-
节点对象.previousElementSibling //获取上一个兄弟元素节点;(只包含元素节点)不包含文本节点;
-
节点对象.nextSibling //获取下一个兄弟元素
-
节点对象.nextElementSibling // 获取下一个兄弟元素节点;(只包含元素节点)不包含文本节点;
-
节点对象.elements // 返回包含表单中所有元素的数组
操作节点对象-改变节点
获取及设置元素节点对象属性
-
获取元素对象属性:
-
方法1:元素对象.属性名 [class需要使用className],仅限于当前标签存在的属性,自定义不可以使用
-
方法2:元素对象.getAttribute('属性名')
-
方法3:元素对象.dataset.index【dataset是H5新增的属性】
-
-
设置元素对象属性:
-
方法1:元素对象.属性名='属性值'
-
方法2:元素对象.setAttribute('属性名','属性值')
-
方法3:元素对象.dataset.index = '01' (通过dataSet新增自定义属性,一般以data-开头的属性名,为程序员之间默认的格式,认为这是一个自定义属性)
-
元素对象.dataset.defaultColor
-
-
移除元素对象属性: removeAttribute("name")
-
delete 元素对象.dataset.XXX
-
案例:获取属性值
<div id='id1' class="active div1" style='color:red'>hello</div>
<script>var div = document.querySelector('#id1');console.log(div.id);console.log(div.className);console.log(div.classList); // 可读div.classList.add('show');// 添加div.classList.remove('div1');// 删除console.log(div.style);
</script>
案例:点击按钮 设置data-XX 或者 获取data-XX的数据
var oLabel = document.querySelectorAll('.content label');
var num = 1;
for(var i=0;i<oLabel.length;i++){oLabel[i].onclick = function(){this.dataset.index = ++num; // 设置this.setAttribute('data-index',num); // 设置console.log(this.dataset.msg); // 获取data-msg}
}
获取及设置元素节点对象内容
-
元素对象.innerHTML(从开始标签-结束标签包括html标签)
-
元素对象.outerHTML(innerHTML的全部和标签本身)
-
元素对象.innerText(只获取元素总的文本内容)
-
表单元素对象.value
节点对象操作
创建节点
方法 | 描述 |
createElement(tagName) | 创建标记名tagName的Element节点。Element节点可以包含文本子节点和属性子节点 例如:node_h1=document.createElement(“h1”) |
createTextNode(text) | 创建包含文本text的文本节点,返回得到的节点如:node_text=document.createTextNode(“hello”) |
appendChild(node) | 向当前节点添加子节点,子节点被添加在子节点列表的尾部。例如:node_h1.appendChild(node_text) |
insertBefore(new,current) | 在current节点前插入new节点。 parentNode.insertBefore(new,current) |
删除节点对象
父节点对象.removeChild("子节点对象")
节点对象.remove() //移除当前元素
替换节点对象
父节点对象.replaceChild("新节点","旧节点")
克隆节点
element.cloneNode(true)
案例1:评论功能
考:使用createElement和使用innerHTML在页面上添加元素,有什么区别?
var box = document.getElementById('box');
// 1. 使用createElement创建节点的方式
for(var i=0; i<100;i++){var a = document.createElement('a');box.appendChild(a);
}
// 2. 使用innerHTML 字符串拼接的方式
for(var i=0; i<100;i++){var a = '<a>hello</a>';box.innerHTML += a;
}
// 3. 使用innerHTML 数组的方式
var arr = [];
for(var i=0; i<100;i++){arr.push('<a>hello</a>');box.innerHTML = arr.join('');
}
总结: innerHTML创建多个元素,效率更高(不要使用拼接字符串,使用数组拼接),结构稍微复杂
createElement 创建多个元素效率稍微低一点,但是结构更清晰 innerHTML 的效率比 createElement 高
DOM元素尺寸
获取当前元素的宽度和高度,定位的left和top
属性 | 描述 |
box.clientWidth | 元素的宽度 |
box.clientHeight | 元素的高度 |
box.scrollWidth,box.scrollHeight | 这组属性可以获取没有滚动条的情况下,元素内容的总高度; |
box.offsetLeft,box.offsetTop | 偏移值;这组属性可以获取当前元素边框相对于父元素边框的位置 |
案例:放大镜效果
<style>.content{width: 1200px;height: 800px;margin: 0 auto;}.shop{float: left;width: 400px;height: 470px;}.box{width: 300px;height: 300px;background: url('./bg.png');}.smallImg{display: flex;justify-content: space-between;}.showimg{position: relative;width: 400px;height: 400px;margin-bottom: 10px;}.mask{width: 200px;height: 200px;background:url('./bg.png');position: absolute;top: 0;left: 0;}.bigImg{position: absolute;width: 400px;height: 400px;top: 0;left: 410px;overflow: hidden;}.bigImg img{position: absolute;}
</style>
</head>
<body><div class="content"><div class="shop"><div class="showimg"><img src="./big.jpg" alt=""><div class="mask"></div><div class="bigImg"><img id="bigs" src="./varybig.jpeg" alt=""></div></div><div class="smallImg"><img src="./small1.jpg" alt=""><img src="./small2.jpg" alt=""><img src="./small5.jpg" alt=""><img src="./small2.jpg" alt=""><img src="./small1.jpg" alt=""><img src="./small2.jpg" alt=""></div></div></div>
</body>
<script>var showimg = document.getElementsByClassName('showimg')[0];var mask = document.getElementsByClassName('mask')[0];var bigImg = document.getElementsByClassName('bigImg')[0];var bigs = document.getElementById('bigs');showimg.onmousemove = function(event){// 1. 获取鼠标的x,y值var x = event.pageX - this.offsetLeft;var y = event.pageY - this.offsetTop;// 2. 把获取到的x,y添加给遮罩层// mask.style.left = x- mask.offsetWidth/2 +'px';// mask.style.top = y- mask.offsetHeight/2 +'px';// 3. 判断遮罩层的边界var maskX = x - mask.offsetWidth/2;var maskY = y - mask.offsetHeight/2;if(maskX <= 0){maskX = 0;}else if(maskX >= showimg.offsetWidth - mask.offsetWidth){maskX = showimg.offsetWidth - mask.offsetWidth;}if(maskY <= 0){maskY = 0;}else if(maskY >= showimg.offsetHeight - mask.offsetHeight){maskY = showimg.offsetHeight - mask.offsetHeight;}mask.style.left = maskX+'px';mask.style.top = maskY+'px';/*** 4. 计算小图和大图之间的比例关系* 遮罩层:100px* 大图窗口:400px* 遮挡层移动距离/遮挡层最大移动距离 = 大图片移动距离/大图片最大移动距离* bx当前位置 = 800*sx当前位置/400* 大图片移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层最大移动距离*/ // 大图片最大移动距离var bigMax = bigs.offsetWidth - bigImg.offsetWidth;var bigMax = bigs.offsetWidth - bigImg.offsetWidth;// 大图片的移动距离 x yvar bigx = maskX * bigMax / (showimg.offsetWidth - mask.offsetWidth);var bigy = maskY * bigMax / (showimg.offsetHeight - mask.offsetHeight);bigs.style.left = -bigx+'px';bigs.style.top = -bigy+'px';}
</script>
DOM元素的其他获取方式
document文档对象的属性OM
document对象拥有大量的属性,这些属性主要用于描述HTML文档中的标题、URL以及HTML文档中的图片、超链接、表单元素等。
属性名 | 说明 |
anchors | 该属性返回一个数组,代表当前文档中的锚 //anchors.length |
forms | form表单对象的数组 |
images | image对象的数组 |
links | link对象的数组 |
lastModified | 返回当前文档的最后一次修改时间 |
title | 设置或返回当前文档的标题 |
常用元素节点对象
document.documentElement html
document.head head
document.title title
document.body body
常用元素节点对象集合
document.all
document.forms
document.images
document.links
document.anchors
遍历节点对象集合
for(var i=0;i<节点对象集合.length;i++){ 节点对象集合[i]
} for(i in 节点对象集合){ 节点对象集合[i]
}
状态码-status
1XX消息: 这一类型的状态码,代表请求已被接受,需要继续处理。
2XX成功: 200请求已成功
3XX重定向: 301被请求的资源已永久移动到新位置。
4XX请求错误: 404 Not Found。 请求失败,请求所希望得到的资源未被在服务器上发现
5XX 服务器错误
端口号
客户端:80http / 443https
数据库:3306
ftp:21
url构成:
https://www.baidu.com:80/index/index.html?page=1&num=10
-
http / https 协议
-
:80 端口号,80默认端口号
-
index:文件夹的名称
-
index.html:被访问的文件的名称
-
?后面:传递的参数,get传參;多个参数用&连接
-
www.baidu.com:域名
相关文章:

DOM对象
DOM概述 官方定义: DOM是W3C制定的一个规范(标准),(Document Object Model,文档对象模型),是提供了访问和操作网页中各元素的方法,让程序可以动态的修改或改变网页元素的内容、样式、结构。 DOM是W3C制定的一个规范…...

[SQL] 数据库图形化安装和使用
一 安装 1.1 图形化安装 下载DataGrip安装包 点击此处一直下一步即可。点击免费使用。 进去界面后,选择新建一个项目 点击加号,创建一个Mysql连接。输入Mysql的连接信息。点击DownLoad下载Mysql的驱动 接下来点击创建的mysq项目中后面的三个点,选择…...
springboot 前后端处理日志
为了实现一个高效且合理的日志记录方案,我们需要在系统架构层面进行细致规划。在某些情况下,一个前端页面可能会调用多个辅助接口来完成整个业务流程,而并非所有这些接口的交互都需要被记录到日志中。为了避免不必要的日志开销,并…...
C++11 简单手撕多线程编程
如何使用线程库 std::thread 创建线程 thread1.join(); 阻塞主线程 thread1.detach(); 线程分离 #include<iostream> #include<thread>void helloworld(std::string msg) {for (int i 0; i < 10000; i){std::cout << i << std::endl;}//std::cou…...
刷c语言练习题7(牛客网)
1、函数fun的声明为int fun(int *p[4]),以下哪个变量可以作为fun的合法参数() A、int a[4][4]; B、int **a; C、int **a[4] D、int (*a)[4]; 答案:B 解析:如果是fun的合法参数,那么其类型应该与定义函数fun中的参数类型…...
Web Worker和WebSocket
Web Worker和WebSocket协议都是Web开发中用于处理多线程和实时通信的技术,但它们的应用场景和工作原理有所不同。 Web Worker Web Worker是HTML5引入的一项技术,它允许JavaScript代码在后台线程中运行,从而实现真正的多线程处理。Web Worke…...

【LeetCode】动态规划—712. 两个字符串的最小ASCII删除和(附完整Python/C++代码)
动态规划—712. 两个字符串的最小ASCII删除和 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系3. 解决方法3.1 动态规划方法3.2 空间优化的动态规划 4. 进一步优化5. 小总结 代码实现PythonPython3代码实现Python 代码解释 CC代码实现C 代码解释 总结: 前言 在字符串处…...
wordpress Contact Form 7插件提交留言时发生错误可能的原因
WordPress Contact Form 7 插件提交留言时发生错误可能有以下几种原因,并提供相应的解决方案: 1. 表单字段验证失败 原因: 用户输入的数据未通过表单字段的验证规则。 解决方案: – 检查表单字段的验证规则是否设置正确。 –…...

uibot发送邮件:自动化邮件发送教程详解!
uibot发送邮件的操作指南?uibot发送邮件的两种方式? 在现代办公环境中,自动化流程的引入极大地提高了工作效率。uibot发送邮件功能成为了许多企业和个人实现邮件自动化发送的首选工具。AokSend将详细介绍如何使用uibot发送邮件。 uibot发送…...

【PostgreSQL】PG数据库表“膨胀”粗浅学习
文章目录 1 为什么需要关注表膨胀?2 如何确定是否发生了表膨胀?2.1 通过查询表的死亡元组占比情况来判断膨胀率2.1.1 指定数据库和表名2.1.2 查询数据库里面所有表的膨胀情况 3 膨胀的原理3.1 什么是膨胀?膨胀率?3.2 哪些数据库元…...
力扣(leetcode)每日一题 871 最低加油次数 | 贪心
871. 最低加油次数 题干 汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,用数组 stations 表示。其中 stations[i] [positioni, fueli] 表示第 i 个加油站位于出发位置东面 positioni 英里处,并且有 f…...

ppt压缩文件怎么压缩?压缩PPT文件的多种压缩方法
ppt压缩文件怎么压缩?当文件体积过大时,分享和传输就会变得困难。许多电子邮件服务对附件的大小有限制,而在网络环境不佳时,上传和下载大文件可能耗时较长。此外,在不同设备上播放时,较大的PPT文件还可能导…...

2024.10月11日--- SpringMVC拦截器
拦截器 1 回顾过滤器: Servlet规范中的三大接口:Servlet接口,Filter接口、Listener接口。 过滤器接口,是Servlet2.3版本以来,定义的一种小型的,可插拔的Web组件,可以用来拦截和处理Servlet容…...

uniapp 锁屏显示插件 Ba-LockShow(可让vue直接具备锁屏显示能力)
简介 Ba-LockShow 是一款可以直接使uniapp的vue界面在锁屏页展示的插件。 支持使vue直接具备锁屏显示能力支持设置锁屏显示和不显示支持唤醒屏幕 截图展示(仅参考) 支持定制、本地包、源码等,有建议和需要,请点击文章结尾“Unia…...

CSS计数器
CSS 中的计数器类似于变量,可以实现简单的计数功能,并将结果显示在页面上,在早期的网站上应用比较广泛。要实现计数器需要用到以下几个属性: counter-reset:创建或者重置计数器;counter-increment…...
嵌入式Linux:信号集
目录 1、信号集初始化 2、向信号集中添加或删除信号 3、测试信号是否在信号集中 在 Linux 系统中,处理多个信号时常用到一种数据结构:信号集(sigset_t)。信号集允许我们将多个信号组织在一起,以便在系统调用中传递和…...

Linux 外设驱动 应用 1 IO口输出
从这里开始外设驱动介绍,这里使用的IMX8的芯片作为驱动介绍 开发流程: 修改设备树,配置 GPIO1_IO07 为 GPIO 输出。使用 sysfs 接口或编写驱动程序控制 GPIO 引脚。编译并测试。 这里假设设备树,已经配置好了。不在论述这个问题…...

基于SpringBoot+Vue+MySQL的留守儿童爱心网站
系统展示 用户前台界面 管理员后台界面 系统背景 随着现代社会的发展,留守儿童问题日益受到关注。传统的纸质管理方式已经无法满足现代人们对留守儿童爱心信息的需求。为了提高留守儿童爱心信息的管理效率,增加用户信息的安全性,并方便及时反…...

调用第三方接口
目录 一、分析给出的接口文档 二、请求体格式之间的区别 三、示例代码 一、分析给出的接口文档 一般的接口文档包括以下几大部分: 1、请求URL:http://{ip}:{port}/api/ec/dev/message/sendCustomMessageSingle 2、请求方式:POST、GET等 3、…...
JAVA 多线程入门例子:CountDownLatch
首先确定线程数量。如果数据集合的大小小于50,就只使用一个线程;否则使用5个线程。计算每个线程平均处理的数据数量sizePerThread以及余数remainder。在划分数据子集合时,对于每个线程的处理范围进行计算。如果有余数,就将余数依次…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...