第二十五节:动态和静态合集

2023-11-18

DOM是JavaScript重要组成部分,在DOM中有三个特别的集合分别是 NodeList(节点的集合),NamedNodeMap(元素属性的集合)和HTMLCollection(html元素的集合) 。这三个集合有一些共同的特点:它们都是一个类数组对象,可以通过中括号表达式来访问集合中元素,也有length属性。但它们并不是数组,而且它们都是动态的(querySelectorAll()返回的NodeList除外),会根据页面元素的变化而变化。

1、NodeList和HTMLCollection相同点及不同点

相同点:

  1. 都是伪数组,都有length属性
  2. 都有item()方法(查找数组的索引)

不同点:

  1. NodeList可以包含12种类型的节点,HTMLCollection只包含一种节点(元素节点)
  2. NodeList有静态的、有动态的,HTMLCollection和NamedNodeMap都是动态集合

动态合集:DOM结构的变化能够自动的反映到保存的对象当中。

2、NodeList

NodeList 对象是节点的集合,通常是由属性,如Node.childNodes 和 方法,如document.querySelectorAll 返回的

NodeList 不是一个数组,是一个类似数组的对象(Like Array Object)。虽然 NodeList 不是一个数组,但是可以使用 forEach() 来迭代。你还可以使用 Array.from() 将其转换为数组。

不过,有些浏览器较为过时,没有实现 NodeList.forEach() 和 Array.from()。你可以用 Array.prototype.forEach() 来规避这一问题

//HTML代码
//<div id="bar">
//	<p id="first">Hello World</p>
//	<p class="a">增加样式 World</p>
//</div>
var aa=document.querySelectorAll('p');
console.log(aa);
//获取元素子节点的2个方法
console.log(document.body.childNodes);//换行,text也会被获取,获取的为NodeList
console.log(document.body.children);//只会获取元素节点,获取元素子节点常用此方法 获取的为HTMLCollection
console.log(document.getElementById('bar').children);
console.log(document.getElementById('bar').childNodes);

伪数组转换数组

//form()方法
console.log(Array.from(aa));
//IE中使用for循环
var selectArr=[];
for(let i=aa.length-1;i>=0;i--){
	selectArr.push(aa[i])
}

NodeList详解

3、HTMLCollection

HTMLCollection 是一个接口,表示 HTML 元素的集合,它提供了可以遍历列表的方法和属性。

//HTML
//<div id="bar">
//	<p id="first">Hello World</p>
//	<p class="a">增加样式 World</p>
//	<ul id="ul"></ul>
//	<input name="myInput" type="text" size="20" /><br />
//	<input name="myInput" type="text" size="20" /><br />
//	<input name="myInput" type="text" size="20" /><br />
//</div>
//获取NodeList和HTMLCollection的方法,但是不同浏览器可能不太一样
console.log('querySelectorAll',document.querySelectorAll('P'));//querySelectorAll NodeList(2) [p, p.a]
console.log('getElementsByName',document.getElementsByName('myInput'));//getElementsByName NodeList(3) [input, input, input]
console.log('getElementsByTagName',document.getElementsByTagName('P'));//getElementsByTagName HTMLCollection(2) [p, p.a]
console.log('getElementsByClassName',document.getElementsByClassName('a'));//getElementsByClassName HTMLCollection [p.a]

4、关于NodeList和HTML的动态性

//HTML
//<div id="bar"></div>
var test=document.getElementById('bar');
var children=test.children;
var tag = test.getElementsByTagName('div');
console.log(children,tag);//HTMLCollection []   HTMLCollection []
//插入div,改变DOM结构
var div=document.createElement('div');
test.appendChild(div);
//合集发生了变化,这就是HTML的动态性
console.log(children,tag);//HTMLCollection [div]   HTMLCollection [div] 

操作属性,变量会发生对应的变化

//HTML
//<div id="bar" class="ceshi"></div>
var test=document.getElementById('bar');
console.log(test.attributes);//NamedNodeMap {0: id, 1: class, id: id, class: class, length: 2}
//增加title属性
test.setAttribute('title','测试');
console.log(test.attributes,test.attributes[2].nodeValue);//NamedNodeMap {0: id, 1: class, 2: title, id: id, class: class, title: title, length: 3} "测试"

HTML中涉及到动态性的有:HTMLCollection、NodeList、NamedNodeMap
动态合集:DOM结构的变化能够自动的反映到保存的对象当中。

5、为什么会有动态合集和静态合集

getElementById 比 querySelectorAll运行速度大概快100倍;getElementById 是直接从缓存中获取,querySelectorAll是读css选择器,然后生成快照,再把快照返回回来。

HTMLCollection详解
其他文章参考:动态合集与静态合集

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第二十五节:动态和静态合集 的相关文章

随机推荐

  • 提高电脑寿命的维护技巧与方法分享

    在维护电脑运行方面 我有一些自己觉得非常有用的技巧和方法 下面我将分享一些我常用的维护技巧 并解释为什么我会选择这样做以及这样做的好处 首先 我经常清理我的电脑内部的灰尘 电脑内部的灰尘会影响散热效果 导致电脑发热严重甚至性能下降 因此 定
  • Google Colab 上部署 Stable Diffusion Web UI

    什么是 Stable Diffusion Web UI Colab Stable Diffusion 是 Stability AI 推出的一个基于深度学习技术文字生成图片AI模型 Stable Diffusion Web UI 是一个强大好
  • [技术经理]03 到底是能力重要,还是态度重要?

    对于一个技术团队而言 团队里面的人员是最最重要的财富 人员的招聘和人员的管理是技术经理最重要的工作之一 但是 事实也是 没有什么问题比人的问题更难处理的了 我先讲两个发生在我们团队里面的事件 今年上半年的时候 我们团队同时入职了两名前端开发
  • C语言中sizeof()和strlen()的区别

    sizeof 一 sizeof的基本概念 sizeof操作符以字节形式给出了其操作数的存储大小 操作数可以是一个表达式或括在括号 内的类型名 操作数的存储大小由操作数的类型决定 二 使用方法 1 用于数据类型 sizeof使用形式 size
  • UBUNTU16.04命令行安装PCL1.7(亲测有效)

    安装PCL点云库 最开始是按照先安装相关依赖 然后github上clone PCL相关版本包的形式安装的 编译遇到了很多问题 结果最后安装完成 但却无法运行例程 难过 又尝试了命令行的形式 命令行的形式直观简单 可安装编译好的点云库 PCL
  • [Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算

    从本专栏开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前一篇详细讲解了卷积神经网络CNN原理 并通过TensorFlow编写CNN实现了MNIST分类学习案例 本篇文章将分享gensim词向量Word2Vec安装
  • 时频分析常用工具:STFT短时傅里叶变换 & 小波变化

    文章目录 1 傅里叶变换的局限性 2 STFT 3 小波变换 参考 时频分析之STFT 短时傅里叶变换的原理与实现 形象易懂讲解算法I 小波变换 https www zhihu com question 58814934 1 傅里叶变换的局
  • MSCOCO数据集格式转化成VOC数据集格式

    MSCOCO数据集格式转化成VOC数据集格式 转载请注明原出处 http blog csdn net ouyangfushu article details 79543575 作者 SyGoing QQ 2446799425 SSD目标检测
  • CUDA(C)和PyCUDA(Python) GPU加速OpenCV视觉

    CUDA 本节介绍一个简单的加法程序 该程序在设备上执行两个变量的加法 虽然它没有利用设备的任何数据并行性 但它对于演示 CUDA C 的重要编程概念非常有用 首先 我们将看到如何编写一个用于添加两个变量的内核函数 内核函数的代码如下所示
  • 面试之JVM类的生命周期

    按照Java虚拟机规范 从class文件到加载到内存中的类 到类卸载出内存为止 它的整个生命周期包括如下7个阶段 加载 类的加载指的是将类的 class文件中的二进制数据读取到内存中 存放在运行时数据区的方法去中 在加载的过程中 jvm需要
  • FFMPEG之H264获取NALU并且解析其RBSP类型03

    FFMPEG之H264获取NALU并且解析其RBSP类型03 前言 FFMPEG之H264理论篇 理论的就不多讲了 可以参考上面那篇文章 下面将给出两种版本 一种是我自己的 用C 方法实现 另一种是雷神版本的 基本是纯C语言 区别是我多了一
  • MySQL 排序时如何把0放最后, 其它按照从小到大排序

    问题描述 MySQL 在排序时 如何从小到大排序 并将0排在最后面 如图 解决办法 利用CASE THEN来处理 原理是将sort等于0的转为比较大的数值放到了最后 其实也是遵循了 sort ASC 的原则 SELECT FROM bann
  • JUC编程

    1 JUC JUC就是java util concurrent工具包的简称 这是一个处理线程的工具包 JDK 1 5开始出现的 1 传统的synchronized public class Synchronized public stati
  • 教你如何将磁盘中黑色的未分配空间变成绿色的可用空间

    在黑色的未分配空间上建立新的卷 使用分区助手或者DiskGenius将新建立的卷从主分区转换成逻辑分区 在磁盘管理中删除这个卷 然后就会变成绿色的空用空间
  • MySQL 体系结构

    一 物理文件 参数文件 告诉Mysql实例启动时在哪里可以找到数据库文件 并且指定某些初始化参数 这些参数定义了某种内存结构的大小等设置 用文件存储 可编辑 若启动时加载不到则不能成功启动 与其他数据库不同 参数有动态和静态之分 静态相当于
  • java面向对象 继承 && 多态

    目录 继承性 inheritance 为什么要有继承 作用 继承举例 方法的重写 重写举例 四种访问权限修饰符 关键字 super 关键字super举例 调用父类的构造器 调用父类构造器举例 子类对象的实例化过程 多态性 概念 使用 多态性
  • vue弹出遮罩层弹窗后禁止底部页面滑动

    方法一 在遮罩层标签上添加 touchmove prevent 方法二 遮罩层显示时把下方的父盒子css设置为固定定位宽100 高100vh 超出隐藏 content width 100 height 100vh overflow hidd
  • Kali Linux介绍(安装教程)

    一 Kali Linux是什么 Kali Linux是基于Debian的Linux发行版 设计用于数字取证操作系统 每一季度更新一次 由Offensive Security Ltd维护和资助 最先由Offensive Security的Ma
  • 以太坊2.0-上海升级节点详细搭建文档

    文章目录 一 配置 JWT 认证 二 部署执行节点geth 2 1 下载geth二进制文件 2 2 geth节点启动 三 部署共识节点Prysm 3 1 下载Prysm脚本 3 2 Prysm容器生成 四 检查节点是否同步完成 4 1 检查
  • 第二十五节:动态和静态合集

    DOM是JavaScript重要组成部分 在DOM中有三个特别的集合分别是 NodeList 节点的集合 NamedNodeMap 元素属性的集合 和HTMLCollection html元素的集合 这三个集合有一些共同的特点 它们都是一个