将NodeList转换为数组

时间:2010-12-29 21:01:55

标签: javascript prototype internet-explorer-8 nodelist

我很难在IE 8中将NodeList转换为数组。以下内容适用于Chrome,但在IE 8 toArray()中无法识别为有效:

NodeList.prototype.toArray = function() {
    var a = [];

    for (var i = 0, len = this.length; i < len; i++) {
        a[i] = this[i];
    }

    return a;
}

document.all.tags("div").toArray();

我尝试将一个原型函数添加到一个数组只是为了检查我的理智并且它正常工作。这让我觉得IE 8实际上并没有返回NodeList?这是一个完整的例子:

http://jsfiddle.net/e4RbH/

我做错了什么?

4 个答案:

答案 0 :(得分:6)

如果您正在寻找使用ES6的现代答案:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from

var nodes = document.querySelectorAll('div');
nodes = Array.from(nodes);

答案 1 :(得分:4)

老问题,但这是一个尝试过的&amp;真正的方法:

var nodes=document.querySelectorAll("div"); //  returns a node list
nodes=Array.prototype.slice.call(nodes);    //  copies to an array

解释

  • document.querySelectorAll使用CSS样式选择器查找元素并返回节点列表。它适用于IE 8。
  • slice方法将类似数组的集合的一部分(在本例中为所有集合)复制到一个新数组中。
  • call允许您从一个对象借用方法以在另一个对象上使用

要查找节点列表,您还可以使用`document.getElementsByTagName(),但这个更灵活。

答案 2 :(得分:3)

首先,不要使用document.all - 它是非标准的并且已弃用。使用document.getElementsByTagName获取您案例中的DIV元素。

其次,不要扩展诸如NodeList之类的DOM对象 - 内置对象是一种非常奇怪的类型,并且不需要像通常使用的任何其他对象一样运行。请参阅此文章以获得对此的深入解释:What's wrong with extending the DOM

答案 3 :(得分:1)

IE不支持标准方式NodeList。这就是为什么你应该滚动自己的命名空间而不是扩展浏览器核心对象。

你可以alert( typeof window.NodeList )查看它是否未定义。