上篇文章以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的更多相关文章

  1. 深入理解javascript中的动态集合——NodeList、HTMLCollection和NamedNodeMap

    × 目录 [1]NodeList [2]HTMLCollection [3]NamedNodeMap[4]注意事项 前面的话 一说起动态集合,多数人可能都有所了解.但是,如果再深入些,有哪些动态集合, ...

  2. js复制对象 和 节点类型和NodeList

    1. myList.cloneNode(true); 在参数为true的情况下,执行深复制,也就是复制节点及其整个子节点树,包括属性 2. myList.cloneNode(false); 在参数为f ...

  3. Js杂谈-DOM

    前言 对jQuery的依赖.导致js的原生方法的淡忘,如果是封装自己的库,那势必要用到js的许多原生方法.从Jquery强大的dom处理开始,我们开始回顾javascript那些古老而坚挺的DOM方法 ...

  4. JavaScript 闯关记

    DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API.DOM 描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 节点层次 DOM 可以将任何 HTML 或 XM ...

  5. ie使用firebug

    在网页插入以下代码即可. <script type="text/javascript" src="http://getfirebug.com/releases/li ...

  6. JavaScript高级程序设计26.pdf

    DOM操作技术 动态脚本 指得是页面加载时不存在,但将来的某一时刻通过修改DOM动态添加的脚本,跟操作HTML元素一样,创建动态脚本也有2种方式:插入外部文件和直接插入JavaScript代码 var ...

  7. 《JavaScript 闯关记》之 DOM(下)

    Element 类型 除了 Document 类型之外,Element 类型就要算是 Web 编程中最常用的类型了.Element 类型用于表现 XML 或 HTML 元素,提供了对元素标签名.子节点 ...

  8. javascript 高级程序设计1--14章重点总结

    js简介 首先介绍了js是一种专门与网页交互而设计的脚本语言.主要由ECMAScript 文档对象模型(DOM) 浏览器对象模型(BOM)三部分组成.分别用来提供核心语言,提供访问和操作网页内容的方法 ...

  9. DOM知识梳理

    DOM 我们知道,JavaScript是由ECMAScript + DOM + BOM组成的.ECMAScript是JS中的一些语法,而BOM主要是浏览器对象(window)对象的一些相关知识的集合. ...

随机推荐

  1. 考试题 T1

    题意分析 就是让你求 \[\sum_{i=1}^{|S|}val[i][gcd(a[i],x)=y]\] 那么接下来就是化简式子 \[\sum_{i=1}^{|S|}val[i][gcd(\frac{ ...

  2. Eclipse 的SVN 的分支

    分支 概念 在版本控制过程中,使用多个分支同时推进多个不同功能开发.   不使用分支开发:人与人之间协作   使用分支开发:小组和小组之间协作 作用  多个功能开发齐头并进同时进行 任何一个分支上功能 ...

  3. 集合之六:Map接口

    Map接口概述 Map接口中的集合和Collection接口中的集合在存储数据的格式上有很大的不同,Map接口下的内容是以<K , V> ,键值对的形式存储的,我们查询API,Map接口的 ...

  4. 浅谈mongodb与Python的交互

    1. mongdb和python交互的模块 pymongo 提供了mongdb和python交互的所有方法 安装方式: pip install pymongo 2. 使用pymongo 导入pymon ...

  5. Oracle 11g

    Oracle 11g 第一章  Oracle 11g数据库简介 1.1  认识Oracle11g Oracle 11g是Oracle 数据库最新的版本,目前已经被企业广泛的应用. 1.2  Oracl ...

  6. whdxlib

    1 数据库系统实现 实 验 指 导 书 齐心 彭彬 计算机工程与软件实验中心 2016 年 3 月2目 录实验一.JDBC 应用程序设计(2 学时) ......................... ...

  7. thinkphp5.0 微信扫码支付模式二

    仅供个人参考,方便大家. 一.1)https://pay.weixin.qq.com/index.php/core/home/login  复制此地址 打开微信商户平台. 2)下载安全操作证书(最好在 ...

  8. 1.CentOS6.5下的基础DNS配置

    常规DNS的安全和配置1.安装DNSyum -y install bind bind-utils安装后生成的文件,我们主要配置下面几个/etc/named.conf/var/named/xx这个xx是 ...

  9. IIS7如何实现访问HTTP跳转到HTTPS访问 转的

    加几句,1.安装url重写模块,不需要重启IIS,安装完了就能用.个人感觉比 IIS REWRITE组件更好用,iis rewrite是安装第三方的那种,不缴费只可以把所有规则写在一起,不能区别站点, ...

  10. Mac系统升级至OS X Mavericks后Genymotion出现的问题及解决方法

    Apple的系统升级终于免费了,可开心满满地升级到OS X Mavericks后,Android模拟器之王Genymotion罢工了.遇到两个问题:1. Unable to load VirtualB ...