2013-07-01 42 views
6

IE8でのみこのエラーメッセージが表示されています。IE8との互換性のために既存の関数を変換する方法がわかりません。IE8 Array.prototype.slice: 'this'はJavaScriptオブジェクトではありません

_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) 
+3

forEachはIE8ではサポートされていません。 – elclanrs

+3

@ elclanrs-私は間違っているかもしれませんが、私はそれがそれほど大きくないとは思っていません。このエラーは、* menuItems *がネイティブオブジェクトではなくDOMオブジェクトであることと一貫しています。ホストオブジェクトは、IEのネイティブオブジェクトと同様に扱うことはできません。 – RobG

+0

* menuItems *とは何ですか?それはDOMオブジェクトですか? – RobG

答えて

5

お問い合わせの際:

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

メニューアイテムに割り当てられたオブジェクトは、ホストオブジェクトである静的NodeList、です。そして、あなたがないとき:

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

あなたはこのとしてホストオブジェクトと組み込みのメソッドを呼び出しています。 IE8以下では、それはできません(現代のブラウザではあなたにはそうするべきではないという仕様はありません)。なぜなら、内蔵forEachのないブラウザで

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

簡単な解決策は、またはadd a shim for Array.prototype.forEachに、コールよりも、他のいくつかの方法を使用してアレイにメニューアイテムを変換し、CrazyTrainの提案を使用することです、それはネイティブメソッドと正常に動作します。しかし、堅牢なコードの場合は、すべてを単純なforループで置き換えてください。

+0

に「shim」を追加しました。 msgstr "" "指定された' '.call()' 'の動作をしなければならないと言う仕様はありませんか? http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4.4 – zerkms

+0

コードを入力してください。これは私が作成したものではなく、私の知識は非常に限られています。ありがとう – Mike

+1

OPに '.forEach()'がパッチされていない場合、そのオッズは '?addEventListener() 'がパッチされていますか? –

関連する問題