将NodeList转换为数组

Nel*_*mel 8 javascript prototype nodelist internet-explorer-8

我很难NodeList在IE 8 中将数据转换为数组.以下在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();
Run Code Online (Sandbox Code Playgroud)

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

http://jsfiddle.net/e4RbH/

我究竟做错了什么?

Jus*_*oel 7

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

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

var nodes = document.querySelectorAll('div');
nodes = Array.from(nodes);
Run Code Online (Sandbox Code Playgroud)


Man*_*ngo 5

老问题,但这是一个久经考验的真实方法:

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

解释

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

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


cas*_*nca 3

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

其次,不要扩展 DOM 对象,例如NodeList——内置对象是一个非常奇怪的品种,不需要像您通常使用的任何其他对象一样运行。请参阅这篇文章以获得对此的深入解释:扩展 DOM 有何问题