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

Mik*_*ike 6 javascript object internet-explorer-8

我只在IE8中收到此错误消息,我不知道如何转换现有的IE8兼容性功能.

_initEvents : function() {
     var self = this;

     Array.prototype.slice.call(this.menuItems).forEach(function(el, i) {
         var trigger = el.querySelector('a');

         if (self.touch) {
             trigger.addEventListener('touchstart', function(ev) {
                   self._openMenu(this, ev); 
               });
         }
         else {
             trigger.addEventListener('click', function(ev) {
                   self._openMenu(this, ev);
               });  
        }
     });
   window.addEventListener('resize', function(ev) {
         self._resizeHandler();
     });

},
Run Code Online (Sandbox Code Playgroud)

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

 Array.prototype.slice.call( this.menuItems )
Run Code Online (Sandbox Code Playgroud)

Rob*_*obG 5

你打电话的时候:

this.menuItems = this.el.querySelectorAll( '.cbp-hsmenu > li' );
Run Code Online (Sandbox Code Playgroud)

分配给menuItems的对象是静态NodeList,它是一个宿主对象.然后你做的时候:

Array.prototype.slice.call( this.menuItems )
Run Code Online (Sandbox Code Playgroud)

您调用与主机对象作为一个内置的方法这个.在IE 8及更低版本(以及可能还有很多其他旧版浏览器)中,你不能这样做(没有规范说你应该,尽管现代浏览器允许你).

简单的解决方案是使用除调用之外的其他方法将menuItems转换为数组,或者Array.prototype.forEach添加填充程序并使用CrazyTrain的建议:

Array.prototype.forEach.call(this.menuItems, func...)
Run Code Online (Sandbox Code Playgroud)

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