NodeList、HTMLCollection和NamedNodeMap
上篇文章以arguments为例讲到了类数组对象,这篇我们讨论更多的类数组对象NodeList、HTMLCollection和NamedNodeMap。既然是类数组对象,这3种对象也都能应用上篇文章中提到的类数组对象的可用方法,下面主要讲讲这3种对象的应用及区别。
HTMLCollection
可以从字面上理解,也就是HTML元素的集合,是一个类数组对象。一般包括getElementsByTagName()、getElementsByClassName()、getElementsByName()等方法的返回值,以及children、document.links、document.forms等元素集合。
<div></div>
<div></div>
<script>
var divs = document.getElementsByTagName("div");
console.log(Array.prototype.toString.call(divs));//"[object HTMLCollection]"
console.log(divs.length);//2
</script>
HTMLCollection是动态的,也就是说对其的增删改都会更新到这个类数组对象中。
<div></div>
<div></div>
<script>
var divs = document.getElementsByTagName("div");
var newDiv = document.createElement("div");
divs[0].parentNode.appendChild(newDiv);//添加一个新div
console.log(divs);//[div,div,div]
</script>
NodeList
同样可以从字面上理解,节点集合,是一个类数组对象,通常由childNodes和querySelectorAll()返回。与HTMLCollection不同的是,NodeList是Node集合,包括但不仅限于HTMLCollection中的元素节点,还可以是其他节点。Node节点共有12种,这里不详细介绍。
<div>
<p></p>
</div>
<script>
var divs = document.getElementsByTagName("div");
//childNode返回值
console.log(Array.prototype.toString.call(divs[0].childNodes));//"[object NodeList]"
console.log(divs[0].childNodes);//[text,p,text]
//querySelectorAll返回值
console.log(Array.prototype.toString.call(document.querySelectorAll("p")));//"[object NodeList]"
console.log(document.querySelectorAll("p"));//[p]
</script>
要注意一点,NodeList不像HTMLCollection都是动态的,通过querySelectorAll()返回的NodeList是静态的,相当于获取时刻的一个快照。
<div>
<p></p>
</div>
<script>
var divs = document.getElementsByTagName("div");
var listChild = divs[0].childNodes;
var listQuery = document.querySelectorAll("p");
divs[0].appendChild(document.createElement("p"));
//childNodes返回值为动态的,增加了一个p元素
console.log(listChild);//[text,p,text,p]
//querySelectorAll返回值为静态,没有变化
console.log(listQuery);//[p]
</script>
NamedNodeMap对象
NamedNodeMap对象比较少见,较为常见的是其实例对象attributes属性。
<div id="myDiv" class="bd"></div>
<script>
var div = document.getElementById("myDiv");
var attrs = div.attributes;
console.log(Array.prototype.toString.call(attrs));//"[object NamedNodeMap]"
console.log(attrs);// {0: id, 1: class, length: 2}
</script>
NamedNodeMap也是动态的
<div id="myDiv" class="bd"></div>
<script>
var div = document.getElementById("myDiv");
var attrs = div.attributes;
div.title = "hello";
console.log(attrs);//{0: id, 1: class, 2: title, length: 3}
</script>
注意:这3种对象基本都是动态集合(querySelectorAll获得的NodeList为静态),这会带来一些便利,但也会带来较大的性能开销。每次访问这类动态集合,都会执行一次文档的搜索,因此要尽量减少DOM操作。而对于与其相关的定值,比如divs.length,若需多次使用,可以考虑将其值缓存起来,以免每次应用时都要进行一次查询。
NodeList、HTMLCollection和NamedNodeMap的更多相关文章
- 深入理解javascript中的动态集合——NodeList、HTMLCollection和NamedNodeMap
× 目录 [1]NodeList [2]HTMLCollection [3]NamedNodeMap[4]注意事项 前面的话 一说起动态集合,多数人可能都有所了解.但是,如果再深入些,有哪些动态集合, ...
- js复制对象 和 节点类型和NodeList
1. myList.cloneNode(true); 在参数为true的情况下,执行深复制,也就是复制节点及其整个子节点树,包括属性 2. myList.cloneNode(false); 在参数为f ...
- Js杂谈-DOM
前言 对jQuery的依赖.导致js的原生方法的淡忘,如果是封装自己的库,那势必要用到js的许多原生方法.从Jquery强大的dom处理开始,我们开始回顾javascript那些古老而坚挺的DOM方法 ...
- JavaScript 闯关记
DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API.DOM 描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 节点层次 DOM 可以将任何 HTML 或 XM ...
- ie使用firebug
在网页插入以下代码即可. <script type="text/javascript" src="http://getfirebug.com/releases/li ...
- JavaScript高级程序设计26.pdf
DOM操作技术 动态脚本 指得是页面加载时不存在,但将来的某一时刻通过修改DOM动态添加的脚本,跟操作HTML元素一样,创建动态脚本也有2种方式:插入外部文件和直接插入JavaScript代码 var ...
- 《JavaScript 闯关记》之 DOM(下)
Element 类型 除了 Document 类型之外,Element 类型就要算是 Web 编程中最常用的类型了.Element 类型用于表现 XML 或 HTML 元素,提供了对元素标签名.子节点 ...
- javascript 高级程序设计1--14章重点总结
js简介 首先介绍了js是一种专门与网页交互而设计的脚本语言.主要由ECMAScript 文档对象模型(DOM) 浏览器对象模型(BOM)三部分组成.分别用来提供核心语言,提供访问和操作网页内容的方法 ...
- DOM知识梳理
DOM 我们知道,JavaScript是由ECMAScript + DOM + BOM组成的.ECMAScript是JS中的一些语法,而BOM主要是浏览器对象(window)对象的一些相关知识的集合. ...
随机推荐
- python 第一天学习(画个正方体)
import turtleturtle.goto(200,0)turtle.goto(200,200)turtle.goto(0,200)turtle.goto(0,0)turtle.penup()t ...
- CentOS 7 安装程序介绍
(一).引导菜单 使用 UEFI 引导 Install CentOS Linux 7 选择此选项开始在你的计算机系统中使用图形安装程序安装 CentOS 7 Test this media & ...
- Mybatis中的@Param注解
前言 今天在使用Mybatis时遇到一个问题,主要出错原因在于Mybatis的@Param注解,如果我不在参数前面加上@Param注解,数据库操作就会报错,如下: @Param作用 @Param注解的 ...
- 「Neerc2016」Expect to Wait
题目描述 ls最近开了一家图书馆,大家听说是ls开的,纷纷过来借书,自然就会出现供不应求的情况, 并且借书的过程类 似一个队列,每次有人来借书就将它加至队尾,每次有人来还书就把书借给队头的若干个人,定 ...
- phpspreadsheet开发手记
坑安装简单示例通过模板来生成文件释放内存单元格根据索引获取英文列设置值合并单元格居中显示宽度设置批量设置单元格格式直接输出下载自动计算列宽函数formula单元格变可点击的超链 PhpSpreadsh ...
- 在国内运行Flutter配置的正确姿势--如出现Oops; flutter has exited unexpectedly.
如果根据flutter的官网教程,在运行flutter doctor时无法下载依赖,请根据以下步骤 export PUB_HOSTED_URL=https://pub.flutter-io.cn ex ...
- webstorm缩进配置
https://blog.csdn.net/m0_37604745/article/details/80076770 设置代码缩进1. 依次打开files —- settings —- Editor ...
- java常量类的实现方式_枚举类_项目实践
前言 众所周知,系统里有很多比如订单状态.审核状态:性别.结算方式.交易类型等属性,这些属性只有几个值,一般用0.1.2.3等的数字标识存入数据库,每次对这些属性所属对象的增删改操作,都会在代码里给状 ...
- 【数组】Subsets II
题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...
- 我爱Markdown (1)
作为一个程序员,用Word, Excel等写技术文档实在是不那么方便.而我,作为一个Unix/Linux程序员,写技术文档还是喜欢用Wiki等在线写作工具.虽然Wiki已经很酷了,但跟Markdown ...