有趣且重要的JS知识合集(21)浏览器内置对象讲解之Dom篇

1、Dom

1.1、概念

Document Object Model(文档对象模型), 整个WEB页面, 所有的Dom元素都在Document整个文档里。DOM就是把整个文档页面当做一个对象进行操作, document 下 包含了 根据 html 创建 的 Dom 对象, 这个DOM对象, 以树形结构展示, 即DOM树

1.2、Node类型

  1. Node.ELEMENT_NODE:数值1,对应元素节点Element。
  2. Node.ATTRIBUTE_NODE:数值2,对应属性节点Attr。
  3. Node.TEXT_NODE:数值3,对应文本节点Text。
  4. Node.CDATA_SECTION_NODE:数值4,对应文档中CDATA部(不会由解析器解析的文本)。
  5. Node.ENTITY_REFERENCE_NODE:数值5,对应实体引用。
  6. Node.ENTITY_NODE:数值6,对应实体类型Entity。
  7. Node.PROCESSING_INSTRUCTION_NODE:数值7,对应处理指令。
  8. Node.COMMENT_NODE:数值8,对应注释节点Comment。
  9. Node.DOCUMENT_NODE:数值9,对应文档节点Document。
  10. Node.DOCUMENT_TYPE_NODE:数值10,对应文档类型节点DocumentType。
  11. Node.DOCUMENT_FRAGMENT_NODE:数值11,对应文档片段节点DocumentFragment。
  12. Node.NOTATION_NODE:数值12,对应DTD中声明的符号

1.3、节点和元素

元素也是节点的一种,所以是包含关系,元素对应类型为ELEMENT_NODE
节点:

  1. 父节点:parentNode
  2. 前兄弟节点:previousSibling
  3. 后兄弟节点:nextSibling
  4. 子节点:childNodes
  5. 第一个子节点:fristChild
  6. 最后一个子节点:lastChild

元素:

  1. 父元素:parentElement
  2. 前兄弟节点:previousElementSibling
  3. 后兄弟节点:nextElementSibling
  4. 子节点:children
  5. 第一个子节点:firstElementChild
  6. 最后一个子节点:lastElementChild

2、DOM操作

2.1、创建

1、document.write

这是我们最开始学习html会遇到的:文档流
浏览器在打开页面时会开启一个文档流,来渲染每个标签,从上到下执行完了后会关闭文档流,
但要是执行完后,再添加document.write,就会输出覆盖body下的所有内容,目前来看,此用法没啥使用场景

2、innerHTML

看到这个会想起innerText和textContent,其实这三区别主要是innerText和textContent是纯文本内容,内部不能插入标签因为不会被解析,而innerHTML可以解析插入的标签,而innerText和textContent区别,我会在最后疑难讲解中仔细说
如果直接用等号(=),会覆盖原来的值,用加等(+=),从视觉角度没有覆盖,就是增加新元素,本质上是把原来的元素取出来,再和新的元素一起添加进去,其实也是覆盖了原来的内容,它会让原来的元素事件失效
textContent 是 Node 对象的属性
innerHTML 是 Element 对象的属性
innerText 是 HTMLElement 对象的属性

3、createElement

创建一个元素
document.createElement(tagName[, options])
tagName: 指定要创建元素类型的字符串
options: 这是高阶用法了,基本没用到
其值是包含一个属性名为 is 的对象,该对象的值是用 customElements.define() 方法定义过的一个自定义元素的标签名

// 定义新元素
customElements.define('expanding-list', ExpandingList, { extends: "ul" });
let expandingList = document.createElement("ul", { is: "expanding-list" });

2.2、增加

2.2.1、appendChild

增到到最后面,即追加:父元素.appendChild(标签名) 注意:这个标签名是变量,不能加引号

2.2.2、insertBefore

增加到某一子元素前面,即插入:父元素.insertBefore(标签名,在哪个元素之前插入)
如果添加的是新创建的元素,就是添加,否则相当于是移动

2.2.3、cloneNode

浅克隆:cloneNode(),只克隆样式(即标签),无内容
深克隆:cloneNode(true),克隆了样式和内容,但是没有方法

2.3、删除

父元素.removeChild(要被删除的元素)

2.4、查找

1、获取单个DOM对象:document.getElementById(‘id’)
2、获取DOM伪数组
xxx.getElementsByTagName(‘标签名’)
xxx.getElementsByClassName(‘类名’)
xxx.querySelector
xxx.quertSelectorAll
获取父元素:parentNode
获取父元素下的子元素:children

  1. children 属性是 Element 对象的一个只读属性,返回一个只包含元素节点(Element 节点)的 HTMLCollection。
  2. children 只会包含元素节点,不包括其他类型的节点(如文本节点或注释节点)。
  3. children 不会包含那些隐藏的元素,比如使用 CSS 的 display: none; 或 visibility: hidden; 隐藏的元素。
  4. 例如,如果一个 div 元素下有若干个子元素,div.children 将返回一个包含这些子元素的 HTMLCollection。
    获取父元素下的所有元素childNodes
  5. childNodes 属性是 Node 对象的一个只读属性,返回一个包含所有子节点的 NodeList。
  6. childNodes 包含父元素下的所有子节点,包括元素节点、文本节点、注释节点等。
  7. childNodes 返回的是一个动态的 NodeList,会随着 DOM 结构的变化而更新。
  8. 例如,如果一个 div 元素下有若干个子节点,包括元素节点、文本节点和注释节点,div.childNodes 将返回包含所有这些子节点的 NodeList。

2.5、修改元素属性

常见:src、href、tittle等
表单:disabled(是否禁用)、checked(单复选框是否选中)、selected(下拉菜单是否选中),这些属性,在js中是写上就代表使用了,因此修改的时候,赋值为true 或false即可
修改样式:dom.style.xxx = ‘xxx’
修改类名:dom.className = ‘’
classList:是一个伪数组,它保存当前这个元素所有的类

  1. add() 添加一个类
    如果要添加多个类,用逗号隔开,每个类都是独立的一个参数
  2. remove() 删除一个类
    如果要删除多个类,用逗号隔开,每个类都是独立的一个参数
  3. contains() 判断是否有某个类
    如果有得到true,如果没有得到false
  4. toggle() 切换一个类
    原来有这个类就删除,原来没有这个类就添加
  5. replace() 替换一个类
    参数1:被替换的类
    参数2:要替换的新类1

2.6、修改自定义属性(拓展)

  1. 新增或设置DOM的属性值:setAttribute()
  2. 获取DOM的属性值:getAttibute()
  3. 移除DOM的属性值(自定义和非自定义都可以移除):removeAttibute()
  4. dateset:
    自定义属性写法规范:以用data-开头,方便识别哪些是自定义的属性
    方法:元素.dataset
    它是一个对象,可以获取所有以data-开头的自定义的属性
    获取单个属性,用元素.dataset.属性名
    设置元素属性,元素.dataset.属性名 = 数据

3、疑难讲解

3.1、innerText和textContent区别?

对浏览器来说,有textContent会优先使用textContent,因为innerText的返回值依赖于页面的显示,而textContent依赖于代码的内容,所以innerText设置会引起浏览器的回流(reflow),至于回流和重绘我就不细讲了,textContent则不会,所以textContent不会导致浏览器有性能问题
innerText被设置 display: none 时,会返回对应节点文本
innerText被设置 visibility: hidden 时,不会返回对应节点文本

3.2 children和childNodes这种伪数组如何遍历?

1、最简单的都是伪数组转数组
Array.from(伪数组).forEach(() => {})
[].slice.call(伪数组, () => {})
[].forEach.call(伪数组, () => {})
2、NodeList类型的伪数组默认可以调用forEach, for
3、HTMLCollection类型的伪数组默认可以调用for

3.3、各种节点类型的详解

3.3.1 Document

JavaScript通过Document类型表示文档。浏览器中的document对象是HTMLDocument的一个实例,表示整个HTML页面。Document节点具有以下特征:

  1. nodeType为Node.DOCUMENT_NODE,值为9。
  2. nodeName的值为#document。
  3. nodeValue的值为null。
  4. parentNode的值为null。
  5. ownerDocument的值为null。
  6. 其子结点可能是一个DocumentType、Element、ProcessingInstruction或Comment。

3.3.2 Element

Element类型用于表现XML或HTML元素,提供对元素标签名、子节点及特性的访问。例如和

等。Element节点具有以下特征:

  1. nodeType为Node.ELEMENT_NODE,值为1。
  2. nodeName的值为元素的标签名。
  3. nodeValue的值为null。
  4. parentNode可能是Document或Element。
  5. 其子节点可能是Element、Text、Comment、ProcessingInstruction、CDATASection或EntityReference。

3.3.3 Attr

Attr类型在DOM表示元素特性。特性是位于元素attributes属性中的节点。具有下列特征:

  1. nodeType为Node.TEXT_NODE,值为3。
  2. nodeName的值是特性的名称。
  3. nodeValue的值是特性的名称。
  4. parentNode的值为null。
  5. 在HTML中不支持子节点(没有子节点)。
  6. 在XML中子节点可以是Text或EntityReference

3.3.4 Text

文本节点由Text类型表示,包含的是可以照字面解释的纯文本内容。纯文本中可以包含转义后的HTML字符,但不能包含HTML代码。Text节点具有以下特征:

  1. nodeType为Node.TEXT_NODE,值为3。
  2. nodeName的值为#text。
  3. nodeValue的值为节点所包含的文本。
  4. parentNode是一个Element。
  5. 不支持子节点(没有子节点)。

3.3.5 Comment

注释在DOM中是通过Comment类型来表示的。Comment节点具有下列特征:

  1. nodeType为Node.COMMENT_NODE,数值为8。
  2. nodeName的值为#comment。
  3. nodeValue的值是注释的内容。
  4. parentNode可能是Document或Element。
  5. 不支持子节点(没有子节点)。

3.3.6 CDATASection

CDATASection类型只针对基于XML文档,表示的是CDATA区域。与Comment类似,CDATASection类型继承自Text类型,因此拥有除splitText()之外的所有字符串操作方法。CDATASection节点具有以下特征:

  1. nodeType为CDATA_SECTION_NODE,值为4。
  2. nodeName的值为#cdata-section。
  3. nodeValue的值是CDATA区域中的内容。
  4. parentNode可能是Document或Element。
  5. 不支持子节点(没有子节点)。

3.3.7 DocumentType

DocumentType类型在Web浏览器中并不常用。DocumentType包含着与文档有关的doctype有关的所有信息,它具有下列特征:

  1. nodeType为Node.DOCUMENT_TYPE_NODE,值为10。
  2. nodeName的值为doctype的名称。
  3. nodeValue的值为null。
  4. parentNode是Document类型。
  5. 没有子节点。

3.3.8 DocumentFragment

DocumentFragment是文档片段,一种"轻量级"文档,可以包含和控制节点,但不像完整文档那样占用额外资源。可以将它作为"仓库"使用。具有下列特征:

  1. nodeType为Node.DOCUMENT_FRAGMENT_NODE,值为11。
  2. nodeName的值为#document-fragment。
  3. nodeValue的值为null。
  4. parentNode的值为null。
  5. 子节点可以是Element、ProcessingInstruction、Comment、Text、CDATASection或EntityReference。

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

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

相关文章

20240322-2-Catboost面试题

Catboost面试题 1. 简单介绍Catboost? CatBoost是一种以对称决策树 为基学习器的GBDT框架,主要为例合理地处理类别型特征,CatBoost是由Categorical和Boosting组成。CatBoost还解决了梯度偏差以及预测偏移的问题,从而减少过拟合的…

C 传递指针给函数

C 语言允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值&#xff1a; #include <stdio.h> #include <time.h>void getSeconds(unsi…

12.填充

12.填充 - 蓝桥云课 (lanqiao.cn) 问题描述 有一个长度为n的01串&#xff0c;其中有一些位置标记为 ?&#xff0c;这些位置上可以任意填充0或者1&#xff0c;请问如何填充这些位置使得这个01串中出现互不重叠的00和11子串最多&#xff0c;输出子串个数 输入格式 输入一行包含一…

element plus的el-image图片发布到nginx不显示

问题&#xff1a; <el-image alt""src"/img/month-b.png" class"card-icon"style"width: 89px;height: 89px;right: -7px;top: -5px;"/> 部署到nginx二级路由访问地址是&#xff1a; http://192.168.1.207/divided/# 这时候使用…

EasyExcel: 高效处理Excel的现代Java库

引言 在现代数据处理中&#xff0c;Excel表格无疑是一种不可或缺的工具。它不仅用于数据的存储和整理&#xff0c;更是在各个领域中广泛应用的数据分析和展示工具。然而&#xff0c;对于Java开发者而言&#xff0c;在处理Excel文件时常常会遇到一些棘手的问题。 传统的Java操…

使用node爬取视频网站里《龙珠》m3u8视频

1. 找到视频播放网站 百度一下 龙珠视频播放 精挑细选一个可以播放的网站。 如&#xff1a;我在网上随便找了一个播放网站&#xff0c;可以直接在线播放 https://www.xxx.com/play/39999-1-7.html 这里不具体写视频地址了&#xff0c;大家可以自行搜索 2.分析网页DOM结…

【面试经典150 | 动态规划】三角形最小路径和

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行…

使用pytorch构建带梯度惩罚的Wasserstein GAN(WGAN-GP)网络模型

本文为此系列的第三篇WGAN-GP&#xff0c;上一篇为DCGAN。文中仍然不会过多详细的讲解之前写过的&#xff0c;只会写WGAN-GP相对于之前版本的改进点&#xff0c;若有不懂的可以重点看第一篇比较详细。 原理 具有梯度惩罚的 Wasserstein GAN (WGAN-GP)可以解决 GAN 的一些稳定性…

十四、Spring源码学习之createBean方法

AbstractAutowireCapableBeanFactory#createBean()方法 protected Object createBean(String beanName, RootBeanDefinition mbd, Nullable Object[] args)throws BeanCreationException {if (logger.isTraceEnabled()) {logger.trace("Creating instance of bean "…

【unity】认识unity Hub的主要功能

这里我们主要讲解unity Hub中的【项目】和【安装】功能&#xff0c;其他对应的功能栏相信大家根据文字就可以知道相应的作用。 首先是介绍【项目】功能&#xff0c;在这里我们可以创建本地项目和云端项目&#xff0c;作为初学者我们创建本地项目皆可&#xff0c;当然如果你是多…

UE4_碰撞_使用蓝图控制物体移动时如何让被阻挡

当我们这样设置蓝图时&#xff1a; 运行效果&#xff1a; 利用蓝图更改一个物体的位置&#xff0c;发现本来两个应该相互阻挡的物体被穿过去了。为了不让相互阻挡的物体被穿过去&#xff0c;我们需要设置好蓝图节点的参数Sweep。 勾选之后 墙的蓝图我们这样设置&#xff1a; 运…

C#-ConcurrentDictionary用于多线程并发字典

ConcurrentDictionary 是 .NET Framework 中用于多线程并发操作的一种线程安全的字典集合类。它提供了一种在多个线程同时访问和修改字典时保持数据一致性的机制。 以下是 ConcurrentDictionary 类的一些重要特性和用法&#xff1a; 线程安全性&#xff1a;ConcurrentDictiona…

【软件工程】需求分析

1. 导言 1.1. 需求文档的目的 该文档是关于用户对于“学生成绩管理系统”的功能和性能的要求&#xff0c;重点描述了“学生成绩管理系统”的设计需求&#xff0c;将作为对该工具在概要设计阶段的设计输入。编写本文档的目的在于说明软件工程管理系统的业务需求内容&#xff0…

30-3 越权漏洞 - 水平越权(横向越权)

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、定义 攻击者可以访问和操作与其拥有同级权限的用户资源。 示例: 学生A在教务系统上正常只能修改自己的作业内容,但由于不合理的权限校验规则等原因,学生A可以修改学生B的内…

点云从入门到精通技术详解100篇-基于3D点云的盘类元件识别与定位

目录 前言 2 3D视觉机器人抓取系统方案设计 2.1 系统硬件方案选型 2.1.1 相机选取方案

记录C++中,vector的迭代器在push_back以后扩容导致迭代器失效的问题

前言 vector是我们用到最多的数据结构&#xff0c;其底层数据结构是单端动态数组&#xff0c;由于数组的特点&#xff0c;vector也具有以下特性&#xff1a; ①O(1)时间的快速访问&#xff1b; ②顺序存储&#xff0c;所以插入到非尾结点位置所需时间复杂度为O(n)&#xff0c;删…

动态规划--(递推2(最长上升子序列,格子染色,斐波那切数列,奇数塔问题,最长子段和))

1281&#xff1a;最长上升子序列 【题目描述】 一个数的序列bi &#xff0c;当b1<b2<…<bS 的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1,a2,…,aN) &#xff0c;我们可以得到一些上升的子序列(ai1,ai2,…,aiK) &#xff0c;这里1≤i1<i2<…

uniapp开发微信小程序设置分包,简单易学

文章目录 前言一、在 manifest.json文件中的源码试图中配置二、配置pages.json 前言 我们使用uniapp开发微信小程序的时候&#xff0c;当我们的包体积过大的时候&#xff0c;无法真机模拟。 因为小程序单个包只支持2MB&#xff08;现已支持预览4MB&#xff09;&#xff0c;所以…

Docker 学习总结(81)—— 冷门而又实用的 Docker 使用技巧总结

1、docker top 这个命令是用来查看一个容器里面的进程信息的,比如你想查看一个 nginx 容器里面有几个 nginx 进程的时候,就可以这么做。 ➜ ~ docker top 3b307a09d20d UID PID PPID C STIME …

JAVA面试大全之开发基础篇

目录 1、常用类库 1.1、平时常用的开发工具库有哪些? 1.2、Java常用的JSON库有哪些?有啥注意点? 1.3、Lombok工具库用来解决什么问题?