HTMLCollection对象和NodeList对象
前言
首先我们先来看下面的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
细心的同学应该会发现一个小问题,就是当我们使用nodeList
和children
获取所有的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
的子对象,后者包括前者,前者是继承自后者。
动态集合
HTMLCollection
和NodeList
都是动态集合,例如下面的例子:
<!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对象的更多相关文章
- HTMLCollection 对象和NodeList 对象
获取html元素有三种方法,其中通过类名和标签获取的结果为一个HTMLCollection对象. HTMLCollection对象可以理解为一个包含html元素的数组(但不是数组),可以通过索引[ ] ...
- NodeList对象的特点
nodeList对象的特点1,nodeList是一种类数组对象,用于保存一组有序的节点.2,通过方括号来访问nodeList的值,有item方法与length属性.3,它并不是Array的实例,没有数 ...
- 简述JavaScript对象、数组对象与类数组对象
问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...
- Document对象和window对象
window对象--- 代表浏览器中的一个打开的窗口或者框架,window对象会在<body>或者<frameset>每次出现时被自动创建,在客户端JavaScript中,Wi ...
- 6、JavaScript进阶篇③——浏览器对象、Dom对象
一.浏览器对象 1. window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 注意:在JavaScript基础篇中,已讲解了部分属性,windo ...
- jQuery 源码解析(七) jQuery对象和DOM对象的互相转换
jQuery对象是一个类数组对象,它保存的是对应的DOM的引用,我们可以直接用[]获取某个索引内的DOM节点,也可以用get方法获取某个索引内的DOM节点,还可以用toArray()方法把jQuery ...
- 判断一个对象是jQuery对象还是DOM对象
今天调试一段代码的时候,看到其中一个变量,想知道它到底是jquery对象还是dom对象. 虽然直接console出这个对象,看它的内部可以判断出来.但是我想有没有什么更方便的方法呢. 后来我想到了一个 ...
- 一种简单,轻量,灵活的C#对象转Json对象的方案(续)
本文参考资料 一种简单,轻量,灵活的C#对象转Json对象的方案 [源码]Literacy 快速反射读写对象属性,字段 一段废话 之前我已经介绍了这个方案的名称为JsonBuilder,这套方案最大的 ...
- jQuery对象和DOM对象的区别
jQuery对象和DOM对象使用说明,需要的朋友可以参考下.1.jQuery对象和DOM对象第一次学习jQuery,经常分辨不清哪些是jQuery对象,哪些是 DOM对象,因此需要重点了解jQuery ...
随机推荐
- Google 的Web开发相关工具
一.PageSpeed Insights PageSpeed Insights 能够针对移动设备和桌面设备生成网页的实际性能报告,并能够提供关于如何改进相应网页的建议. 在线工具:https://de ...
- poj1236 Network of Schools(SCC缩点+结论推导)
第一问简单不讲. 第二问简化后问题是给一张DAG求最少添加几条边使得DAG变成一个SCC.首先所有中间点(有入度有出度)肯定直接顺着走到无出度点,所以肯定是无出度点连向无入度点. 把无入度点作为点集S ...
- HTTP 协议讲解
http请求由三部分组成,分别是:请求行.消息报头.请求正文 HTTP(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接 ...
- 报错Too many connections
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establish ...
- 错误信息:[ERR] Sorry, can't connect to node 10.211.55.8:7001
错误信息: [root@centos-linux redis-cluster]# ./redis-trib.rb create --replicas 1 10.211.55.8:7001 10.211 ...
- Java Spring MVC工作流程
本文是对 SpringMVC 工作流程的总结,自己一定要可以用语言描述. 名词解释: DispatcherServlet:前端控制器,是 SpringMVC 工作流程的中心,负责调用其他组件,在系统启 ...
- 通过python的urllib.request库来爬取一只猫
我们实验的网站很简单,就是一个关于猫的图片的网站:http://placekitten.com 代码如下: import urllib.request respond = urllib.request ...
- 解决vscode打开空白的问题
环境 :win7,最新vscode 问题:打开后窗口全黑,但是原按钮对应位置还有触摸手势,显示tag等,卸载重装等无效,如上图 最终方案: 启动方式后加 --disable-gpu 解决思路(其余参考 ...
- BZOJ1070: [SCOI2007]修车(最小费用最大流,思维)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- Palindrome Degree(CodeForces 7D)—— hash求回文
学了kmp之后又学了hash来搞字符串.这东西很巧妙,且听娓娓道来. 这题的题意是:一个字符串如果是回文的,那么k值加1,如果前一半的串也是回文,k值再加1,以此类推,算出其k值.打个比方abaaba ...