深入理解 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就是我们要的数组  
} 
复制代码

 

参考自:http://hi.baidu.com/anywing2000/item/b498a611e69e029898ce336c

本文转自挨踢前端博客园博客,原文链接http://www.cnblogs.com/duanhuajian/archive/2013/04/28/3049533.html如需转载请自行联系原作者


@挨踢前端

相关文章
|
存储 编译器 C语言
【C语言】判断字符类型的三种方法
【C语言】判断字符类型的三种方法
707 0
|
存储 编译器 C语言
【C语言必知必会 | 第三篇】顺序结构入门,这一篇就够了
【C语言必知必会 | 第三篇】顺序结构入门,这一篇就够了
982 0
|
存储 数据挖掘 数据库
【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】
【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】
|
SQL 关系型数据库 MySQL
MySQL - 一文解析 SQL 的执行顺序
MySQL - 一文解析 SQL 的执行顺序
563 0
|
运维 搜索推荐 数据安全/隐私保护
什么是C端 什么是B端 这里告诉你
C端产品早已将运营专业化,并细化到各维度的运营了,比如运营的工种可以细分为“活动运营岗、用户运营岗、增长裂变岗、内容运营岗”等等。
15282 0
什么是C端 什么是B端 这里告诉你
|
存储 Python
Python中的函数与模块:核心概念与实践
Python中的函数与模块:核心概念与实践
243 4
|
域名解析 网络协议 Linux
Linux 中的 Nslookup 命令怎么使用?
【4月更文挑战第12天】
1220 6
Linux 中的 Nslookup 命令怎么使用?
|
存储 前端开发 搜索推荐
13:Session机制实现用户登录与注销功能-Java Web
13:Session机制实现用户登录与注销功能-Java Web
962 3
|
安全 网络协议 网络安全
Socks5代理与HTTP代理的区别与优劣
在互联网时代,隐私和安全至关重要,代理服务器如socks5和HTTP代理成为保护个人信息的工具。socks5代理支持多种网络流量和UDP协议,更具灵活性和通用性,但设置复杂;HTTP代理则更常见、易用,适合仅处理HTTP流量的场景,但限制较多。选择哪种代理取决于具体需求和应用场景。
|
存储 NoSQL 大数据
【大数据】LSM树,专为海量数据读写而生的数据结构
【大数据】LSM树,专为海量数据读写而生的数据结构
781 0