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。在划分数据子集合时,对于每个线程的处理范围进行计算。如果有余数,就将余数依次…...

k8s jenkins 动态创建slave
k8s jenkins 动态创建slave 简述使用jenkins动态slave的优势:配置jenkins动态slave配置 Pod Template配置容器模板挂载卷 测试 简述 持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程&am…...

MVS海康工业相机达不到标称最大帧率
文章目录 一、相机参数设置1、取消相机帧率限制2、修改相机图像格式3、调整相机曝光时间4、检查相机数据包大小(网口相机特有参数)5、 恢复相机默认参数6、 相机 ADC 输出位深调整 二、系统环境设置1、 网口相机设置2、 USB 相机设置 一、相机参数设置 …...

数据结构:用双栈实现一个队列
要用两个栈实现一个队列,可以利用“栈”的后进先出 (LIFO) 特性来模拟“队列”的先进先出 (FIFO) 操作。具体做法是使用两个栈:一个作为入栈栈,另一个作为出栈栈。 算法步骤 入队操作(enqueue): 将元素压…...

QScroller Class
Header:#include < QScroller > qmake:QT += widgets Since:Qt 5.0 Inherits:QObject This class was introduced in Qt 5.0. Public Types enum Input {InputPress, InputMove, InputRelease } enum ScrollerGestureType {TouchGesture, LeftMouseButtonGesture,…...

React高阶组件详解
React高阶组件(HOC)详解 定义 React高阶组件(HOC)是一个函数,该函数接受一个组件作为参数并返回一个新的组件。高阶组件本身不是一个组件,而是一个函数,它利用React的组合特性,对传入…...

TextView把其它控件挤出屏幕的处理办法
1.如果TextView后面的控件是紧挨着TextView的,可以给TextView添加maxWidth限制其最大长度 上有问题的布局代码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns:android"http://schemas.android.com/apk/res/android&qu…...

长度为 K 的重复字符子串数目
长度为 K 的重复字符子串 给你一个由小写字母组成的长度为n的字符串 S ,找出所有长度为 k 且包含重复字符的子串,请你返回全部满足要求的子串的数目。 数据范围: 2≤k≤400 , 5≤n≤900 进阶: 时间复杂度O(n),空间复杂…...

html+css+js实现轮播图
实现效果: HTML部分 <div class"carousel"><div class"carousel-wrapper"><img src"./image/1.png" alt""></div><ul class"carousel-indictor"><li class"active"…...

Boost集成模型异同
一、常见Boost集成模型 AdaBoost、GBDT和XGBoost都是集成学习中的提升(Boosting)算法,它们通过组合多个弱学习器来构建一个强学习器。从经验上来说,XGBoost是诸多竞赛的大杀器,在实际业务工作中可能需要用到集成模型的…...

【系统架构设计师】案例专题四:嵌入式系统考点梳理
更多内容请见: 备考系统架构设计师-核心总结目录 摘要:本文主要梳理系统架构设计师 - 嵌入式系统 案例考点 ,主要包括嵌入式相关概念、软件和硬件可靠性、冗余技术、软件容错、集群技术、负载均衡、可维护性的评价指标、软件维护的分类等。 文章目录 一、相关概念二、软件可…...