前言

首先我们先来看下面的demo,假如我们需要给所有的li字体变一个颜色。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<ul id="list">
<li>aaaaaaa</li>
<li>aaaaaaa</li>
<li>aaaaaaa</li>
<li>aaaaaaa</li>
</ul>
</body>
</html>

下面我们将通过两种方式来实现需求。

childNodes

首先我们先来通过childNodes来获取li。

var list = document.getElementById('list');
var lis = list.childNodes;
console.log(lis);

此时需要注意的是,通过childNodes获取的list里面的子节点,数量远远超过了li的数量,原因是在js当中,节点的分类当中不仅仅包括了标签,连同文本、注释等等都会被包括在内。所以当我们获取内容时,连同li之外的节点也找到了。

下面是js当中节点的常见分类:

那么此时如果我们直接给li设置color属性就会直接报错:

	for(var i=0;i<lis.length;i++) {
lis[i].style.color = 'red'
}

错误如下:

HTMLCollection 和 NodeList.html:21 Uncaught TypeError: Cannot set property 'color' of undefined

如果想要设置样式,需要在代码中判断一下节点的类型:

for(var i=0;i<lis.length;i++) {
if(lis[i].nodeType === 1) {
lis[i].style.color = 'red'
}
}

通过nodeType判断节点类型是否是一个元素,如果是再来设置样式。

children

其实我们还可以采用更简单的形式来进行需求的实现:

var list = document.getElementById('list');
var lis = list.children;
for(var i=0;i<lis.length;i++){
lis[i].style.color = 'red'
}

在上面的代码中,我们将childNodes换成了children,这样我们直接获取了list当中所有的li,并且仅仅获取了li。

这样我们直接在循环中完成了样式的设置。

相对于上面的写法,我们会发现简单了不少。

HTMLCollection 和 NodeList

细心的同学应该会发现一个小问题,就是当我们使用nodeListchildren获取所有的li后,打印出来的对象并不一样。

这是通过nodeList打印出来的结果:

下面这是通过children打印出来的结果:

你会发现二者一个是nodeList对象,一个是HTMLCollection对象。

下面我们来聊聊这两个对象。

首先,当我们获取元素时,如果通过下面的api获取元素就可以获得一个HTMLCollection对象:

1:getElementsByTagName() 

2:document.forms.item()

3: document.forms.namedItem()

而如果通过下面的方式将会获得一个NodeList对象:

childNodes
querySelectorAll()
getElementsByClassName()[一些旧版本的浏览器也返回NodeList对象]

如果仅仅从表面看,这两个对象其实非常相似,都是类数组对象,但是二者却有着一个最大的区别:一个是元素集合(HTMLCollection)一个是节点集合(NodeList)

在元素集合当中仅仅包括元素标签,而节点集合还可能包括其他类型的节点。

二者之间在使用上还有一点区别,在HTMLCollection中除了可以使用索引获取元素以外,还可以使用name、id来获取元素。而NodeList仅仅可以通过索引来获取元素。

当然,这两个对象也存在一些相同的地方:

二者都是类数组对象,具有length属性,但是却不能够使用数组的方法

二者都可以通过类似数组的方式,使用索引获取元素。

Tip: HTMLCollection可以理解为是NodeList的子对象,后者包括前者,前者是继承自后者。

动态集合

HTMLCollectionNodeList都是动态集合,例如下面的例子:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<ul id="list"></ul>
</body>
<script type="text/javascript">
var list = document.getElementById('list');
console.log(list)
var li = document.createElement('li'); list.appendChild(li);
console.log(list)
</script>
</html>

虽然在插入节点之前console了结果,但是依然是最新的插入节点之后的结果:

querySelectorAll

需要注意的是,虽然querySelectAll也会产生一个NodeList对象,但是却是NodeStaticList,是一个静态集合,这一点较为特殊,并不是一个实时的对象,需要额外的注意。

HTMLCollection对象和NodeList对象的更多相关文章

  1. HTMLCollection 对象和NodeList 对象

    获取html元素有三种方法,其中通过类名和标签获取的结果为一个HTMLCollection对象. HTMLCollection对象可以理解为一个包含html元素的数组(但不是数组),可以通过索引[ ] ...

  2. NodeList对象的特点

    nodeList对象的特点1,nodeList是一种类数组对象,用于保存一组有序的节点.2,通过方括号来访问nodeList的值,有item方法与length属性.3,它并不是Array的实例,没有数 ...

  3. 简述JavaScript对象、数组对象与类数组对象

    问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...

  4. Document对象和window对象

    window对象--- 代表浏览器中的一个打开的窗口或者框架,window对象会在<body>或者<frameset>每次出现时被自动创建,在客户端JavaScript中,Wi ...

  5. 6、JavaScript进阶篇③——浏览器对象、Dom对象

    一.浏览器对象 1. window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 注意:在JavaScript基础篇中,已讲解了部分属性,windo ...

  6. jQuery 源码解析(七) jQuery对象和DOM对象的互相转换

    jQuery对象是一个类数组对象,它保存的是对应的DOM的引用,我们可以直接用[]获取某个索引内的DOM节点,也可以用get方法获取某个索引内的DOM节点,还可以用toArray()方法把jQuery ...

  7. 判断一个对象是jQuery对象还是DOM对象

    今天调试一段代码的时候,看到其中一个变量,想知道它到底是jquery对象还是dom对象. 虽然直接console出这个对象,看它的内部可以判断出来.但是我想有没有什么更方便的方法呢. 后来我想到了一个 ...

  8. 一种简单,轻量,灵活的C#对象转Json对象的方案(续)

    本文参考资料 一种简单,轻量,灵活的C#对象转Json对象的方案 [源码]Literacy 快速反射读写对象属性,字段 一段废话 之前我已经介绍了这个方案的名称为JsonBuilder,这套方案最大的 ...

  9. jQuery对象和DOM对象的区别

    jQuery对象和DOM对象使用说明,需要的朋友可以参考下.1.jQuery对象和DOM对象第一次学习jQuery,经常分辨不清哪些是jQuery对象,哪些是 DOM对象,因此需要重点了解jQuery ...

随机推荐

  1. 关于maven依赖死活都下载不了终极解决方案

    项目想下载一个依赖,在idea中死都下不了,查看网上各种解决方案都没有效果,出绝招,我使用命令下载jar然后导入到项目引用的maven仓库 类似这种命令:mvn install:install-fil ...

  2. java双指针的简单理解

    一.什么是双指针 双指针我所理解地是在遍历对象时,不是使用单个指针进行访问,而是使用两个相同方向或者相反方向的指针进行遍历,从而达到相应的目的. 在JAVA中并没有像C/C++指针地概念,所以这里所说 ...

  3. Hive的JDBC连接

    首相要安装好hive 1.首先修改配置文件文件为hive 路径下的  conf/hive-sit.xml 将内容增加 <property> <name>hive.server2 ...

  4. STM32调试利器之ITM

    原创: Osprey  鱼鹰谈单片机 2月17日 STM32 有一个代码跟踪功能,即 ITM,这个调试功能非常强大,可以替代串口输入输出功能,而且只需要占用一根 I/O 线就可以实现.当然它的好处不仅 ...

  5. UVALive 6859——凸包&&周长

    题目 链接 题意:在一个网格图上,给出$n$个点的坐标,用一个多边形包围这些点(不能接触,且多边形的边只能是对角线或直线),求多边形的最小周长. 分析 对于每个点,我们考虑与之相邻的4个点.一共由 $ ...

  6. 记录 vant Picker 选择器,实现三级联动,传对应省市区code值

    最近使用vant UI写移动端,感觉还不错 功能挺全的,带的还有省市区三级联动. 但是 突然遇到一个 产品要传的 省市区的code码,还和vant的 邮编不一样,我*****. 看了一下vant UI ...

  7. Leetcode部分题目整理(Javascript)

    3.无重复字符的最长子串 /** * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s ...

  8. 在 CentOS 7 上安装 RabbitMQ

    RabbitMQ 服务器在安装之前需要安装 erlang. 最新版本的 RabbitMQ 3.8.0 需要 Erlang 21.3 以上的版本支持. 在这里,我们需要在你的 CentOS 中安装 Er ...

  9. UVALive 7178 Irrational Roots 多项式的根

    题意:给你一个首项为1的n阶方程(n<=8),求出方程的无理数的根: #include <cstdio> #include <iostream> #include < ...

  10. 阿里云Ubuntu安装LNMP环境之PHP7

    在QQ群很多朋友问阿里云服务器怎么安装LNMP环境,怎么把项目放到服务器上面去,在这里,我就从头开始教大家怎么在阿里云服务器安装LNMP环境. 在这之前,我们先要知道什么是LNMP. L: 表示的是L ...