6

我只在 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();
     });

},

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

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

1 回答 1

5

你打电话时:

this.menuItems = this.el.querySelectorAll( '.cbp-hsmenu > li' );

分配给menuItems的对象是一个静态NodeList,它是一个宿主对象。那么当你这样做时:

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

您正在调用带有主机对象的内置方法this。在 IE 8 及更低版本(可能还有许多其他较旧的浏览器)中,您不能这样做(没有规范说您应该这样做,尽管现代浏览器允许您这样做)。

简单的解决方案是使用call以外的其他方法将menuItems转换为数组,或者为Array.prototype.forEach添加一个 shim并使用 CrazyTrain 的建议:

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

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

于 2013-07-01T02:51:57.123 回答