9

我很难NodeList在 IE 8 中将 a 转换为数组。以下内容在 Chrome 中完美运行,但在 IE 8toArray()中不被识别为有效:

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 实际上并没有返回 a NodeList? 这是一个完整的例子:

http://jsfiddle.net/e4RbH/

我究竟做错了什么?

4

4 回答 4

11

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

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

var nodes = document.querySelectorAll('div');
nodes = Array.from(nodes);
于 2017-10-08T13:12:01.250 回答
5

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

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(),但这个更灵活。

于 2017-01-22T05:18:20.530 回答
3

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

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

于 2010-12-29T21:08:40.327 回答
1

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

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

于 2010-12-29T21:04:03.387 回答