IE8 Array.prototype.slice:';这';不是JavaScript对象

IE8 Array.prototype.slice:';这';不是JavaScript对象,javascript,object,internet-explorer-8,Javascript,Object,Internet Explorer 8,我只在IE8中收到这个错误消息,我不知道如何转换现有函数以实现IE8兼容性 以上只是其中的一部分,我认为不需要其他的。错误发生在这里: 当你打电话时: this.menuItems = this.el.querySelectorAll( '.cbp-hsmenu > li' ); 分配给menuItems的对象是一个静态对象,它是一个宿主对象。然后,当您这样做时: Array.prototype.slice.call( this.menuItems ) 您正在使用主机对象调用一个内置方

我只在IE8中收到这个错误消息,我不知道如何转换现有函数以实现IE8兼容性

以上只是其中的一部分,我认为不需要其他的。错误发生在这里:

当你打电话时:

this.menuItems = this.el.querySelectorAll( '.cbp-hsmenu > li' );
分配给menuItems的对象是一个静态对象,它是一个宿主对象。然后,当您这样做时:

Array.prototype.slice.call( this.menuItems )

您正在使用主机对象调用一个内置方法,如下所示。在IE8和更低版本(可能还有很多其他较旧的浏览器)中,你不能这样做(没有规范规定你应该这样做,尽管现代浏览器允许你这样做)

简单的解决方案是使用call以外的其他方法将menuItems转换为数组,或者使用CrazyTrain的建议:

Array.prototype.forEach.call(this.menuItems, func...)

因为在没有内置forEach的浏览器中,它将是一种本机方法,并且工作正常。但是对于健壮的代码,用一个简单的for循环来代替所有这些。

forEach
在IE8中不受支持。@elclanrs-I可能是错误的,但我怀疑它没有达到那个程度。该错误与menuItems是DOM对象而不是本机对象一致。主机对象不能被视为IE中的本机对象。什么是菜单项?它是DOM对象吗?@RobG:我马上也这么想。例如,如果它是一个节点列表,
slice()
不会将其转换为IE中的数组,因此没有理由进行切片。由于您似乎已对
.forEach()
进行了填充,因此只需执行
Array.prototype.forEach.call(this.menuItems,func…
)。这将避免IE8将本机方法的
This
值设置为非本机对象的问题。“没有说明您应该这样做。”——规范没有说明
.call()
的行为吗?你能提供一段代码吗。这不是我创建的东西,我的js知识非常有限。谢谢如果OP没有修补
.forEach()
,那么修补
.addEventListener()
的几率有多大?@Mike:只要你找到
.forEach()
的修补程序,你就会意识到
.addEventListener()
是行不通的。我猜你正在使用某个人为现代浏览器编写的代码。为了使IE8工作,您可能需要考虑加载一个.@ CelkMS-:“……而且是某些环境特定的主机对象,其描述和行为超出了本规范的范围”。问题不在于内置方法,而在于宿主对象。
Array.prototype.slice.call( this.menuItems )
Array.prototype.forEach.call(this.menuItems, func...)