9

据我了解,IE8 可以访问该Array.prototype.slice方法。然而,当我尝试调用它以将 aNodeList转换为数组时,它给了我错误Array.prototype.slice: 'this' is not a JavaScript object你可以在这里查看,或者在这里查看我的代码:

HTML

<div id="test">Test</div>

JavaScript

var divs = document.getElementsByTagName('div');
divs = Array.prototype.slice.call(divs);
console.log(divs);

这里发生了什么?

4

3 回答 3

9

更新: ANodeList在某些方面可以被视为一个数组 - 在循环之前,您实际上不需要对它做任何特别的事情,例如:

var aDivs = [];
for (var = i = 0; i < divs.length; i++) {
    aDivs.push(divs[i]);
}

这将创建一个数组,其中包含您运行时匹配的所有节点document.getElementsByTagName()

有关为什么在某些浏览器中使用 a而不是其他浏览器的完整解释,请参阅此问题,但它从规范中归结为这句话:sliceNodeList

切片函数能否成功应用于宿主对象取决于实现。

于 2012-11-10T00:00:00.157 回答
2

错误消息是准确的 - 您的节点列表不是 JavaScript 对象,它是一个“主机对象”,您不一定像常规 JavaScript 对象那样传递它。在 IE8 的 JavaScript 控制台中运行此代码:

document.querySelectorAll("div") instanceof Object

它返回false

于 2012-11-10T00:17:23.313 回答
0

我假设即使 NodeList 集发生更改,您也希望保持相同的内容。

如果是这种情况,坏消息:IE8 坏了。它无法处理在 NodeList 上使用 slice。

因此,当切片失败时(通过使用 try/catch),您将需要使用后备并自己制作“切片”。

请注意,如果您不希望 DOM 发生变化,并且类似数组的对象就足够了,那么您可以像使用任何其他数组一样使用 NodeList(除了它不是,并且如果DOM 更改)。

[编辑]实际上这不是一个损坏的设计,它是标准允许的(如 Kelvin Mackay 评论中的链接所述)

于 2012-11-10T00:10:15.963 回答