深入理解 NodeList
在web前端编程中,我们通常会通过document.getElementsByTagName的方法取出一组相同标签的dom元素,比如:
var list = document.getElementsByTagName("li");
for (i = 0; i < list.length; i++) {
var lis = list[i];//取某一个元素
//more code
}
首先说明:通过这种方法获取的这一组dom元素,不是数组(Array),而是NodeList,NodeList不是数组。
我们可以直接获取它的length属性,还可以根据索引取到对应的单独元素,难道不是数组吗?如果,你已经对javascript稍微有过深入的了解,有length属性,可以索引取值,一定是数组吗,好像arguments也会这么一手吧,arguments是数组?当然不是!
1、NodeList为什么不是数组!
验证NodeList是不是数组,最直接的方法也许是试一下Array专有的push和pop方法:
var list = document.getElementsByTagName("li");
var a = document.createElement("a");//新建一个a元素
list.push(a);//push
var element= list.pop();//pop
通过测试,上面的代码不管是push还是pop方法,无一例外的会提示你没有push或者pop方法。当然这种测试有点片面。我们完全可以像证明arguments不是数组一样,也用同样的方法证明NodeList不是数组。那就是修改它的原型,来测试。看下面的代码吧:

Array.prototype.testNodeList = "test nodelist"; //数组添加原型属性
function NodeList() {
var list = document.getElementsByTagName("li");
alert(list.testNodeList);
}
function test() {
alert(new Array().testNodeList); //test nodelist
NodeList(); //undefined
}
test(); //测试一下

通过上面的分析,我们可以肯定NodeList不是数组(Array)了。那么如何按照我们操作集合的习惯操作NodeList呢?
2、像操作Array一样操作NodeList
既然NodeList有length,可以for循环索引取值,转换成数组还不是轻而易举。最直接的思路是这样的:先new一个Array,遍历NodeList,然后将每一个单独的元素push到数组变量里,最后操作数组变量。

var arr = [];
var list = document.getElementsByTagName("li");
for (var i = 0; i < list.length; i++) {
var li = list[i];
arr.push(li); //arr就是我们要的数组
}

深入理解 NodeList的更多相关文章
- 怎样理解NodeList的动态集合与静态集合
NodeList 有两种, 一种是动态集合, 一种是静态集合, 所谓动态集合, 主要是 Node.prototype.childNodes; 返回的子节点集合对文档的节点增删改会即时改变; 而静态集合 ...
- 使用NodeList
理解NodeList.NamedNodeMap和HTMLCollection是整体透彻理解DOM的关键. 这三个集合都是“动态”的,也就是说:每当文档结构发生变化时,他们都会得到更新,他们始终保存的都 ...
- DOM中的NodeList与HTMLCollection
最近在看<Javascript高级程序设计>的时候,看到了这样一句话:“理解NodeList和HTMLCollection,是从整体上透彻理解DOM的关键所在.”,所以觉得应该写一篇关于N ...
- js复制对象 和 节点类型和NodeList
1. myList.cloneNode(true); 在参数为true的情况下,执行深复制,也就是复制节点及其整个子节点树,包括属性 2. myList.cloneNode(false); 在参数为f ...
- Js杂谈-DOM
前言 对jQuery的依赖.导致js的原生方法的淡忘,如果是封装自己的库,那势必要用到js的许多原生方法.从Jquery强大的dom处理开始,我们开始回顾javascript那些古老而坚挺的DOM方法 ...
- DOM之操作技术
1.1 动态脚本 动态加载的外部JS文件能够立即运行.难点在于如何知道脚本加载完成了?可以通过事件来检测.IE对待<script>元素特殊性,不允许DOM访问其子节点.使用元素的text属 ...
- JavaScript 闯关记
DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API.DOM 描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 节点层次 DOM 可以将任何 HTML 或 XM ...
- JavaScript高级程序设计26.pdf
DOM操作技术 动态脚本 指得是页面加载时不存在,但将来的某一时刻通过修改DOM动态添加的脚本,跟操作HTML元素一样,创建动态脚本也有2种方式:插入外部文件和直接插入JavaScript代码 var ...
- 《JavaScript 闯关记》之 DOM(下)
Element 类型 除了 Document 类型之外,Element 类型就要算是 Web 编程中最常用的类型了.Element 类型用于表现 XML 或 HTML 元素,提供了对元素标签名.子节点 ...
随机推荐
- android studio 使用ndk编译.C文件生成so文件
task buildSo(type: Exec) { //windows commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePat ...
- 解决 umount 时出现的 "Device is busy"
1.umount, 老是提示:device is busy, 服务又不能停止的. 可以用"umount -fl"解决! 2.mount的基本用法是? 格式:mount [-参数] ...
- DBSCAN——python实现
# -*- coding: utf-8 -*- from matplotlib.pyplot import * from collections import defaultdict import r ...
- Python基础篇【第6篇】: Python装饰器
装饰器 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类, ...
- linux中mysql如何设置为开机启动
开机启动命令 chkconfig mysqld on 查询是否设置为开机启动命令 chkconfig --list mysqld 结果为 mysqld 0:关闭 1:关闭 2:启动 3:启动 4:启动 ...
- mysql日志与备份恢复
一.mysql日志: mysql的日志种类有很多,常见的有二进制日志,一般查询日志,满查询日志,中继日志,事务日志等,具体信息可以通过 mysql> SHOW GLOBAL VARIABLES ...
- ffmpeg relocation error
在向imx6移植ffmpeg后,一般的编解码操作没有问题,但是当从摄像头录视频时, ffmpeg -f video4linux2 -s 640*480 -r 10 -i /dev/video0 tes ...
- 进击的docker 二 : docker 快速入门
1.安装docker 1.1.安装环境 [root@docker ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@docke ...
- 【原创】安装LoadRunner12.53 版本时出现Critical error的解决方法
步骤: 1.在官网上下载LoadRunner12.53正版,只不过要注册,然后官网会给个序列号. 2.安装成功之后,快捷键已创建,打开Virtual User Generator时,提示如下错误: 此 ...
- 简单的 Promise 实现
参考 http://www.tuicool.com/articles/RzQRV3 var PENDING = undefined, FULLFILLED = 1, REJECTED = 2; var ...