2016-12-14 19 views
2

コンソールでこのスニペットを実行しています。 IEでは、期待どおりの出力を生成します。参照のためにCrとFFで同じことを実行すると、動作の合同性が確認されます。オブジェクトがそれに宣言されていないのforEach(...)を持っていることを私に言ってIEはコンソールから呼び出されたときにforEach(...)をサポートしますが、コードから呼び出されたときはサポートしません

["a", "b"].forEach(function(element) { 
    console.log(element); 
}); 

次のスクリプトを実行している場合しかし、私はエラーを取得しています。この問題はIEでは発生しますが、CrやFFでは発生しません。

var menus = document.querySelectorAll("ul.application>li>a"); 
menus.forEach(function(element) { ... } 

私は変数メニューが宣言されていることをチェックしましたし、それはそれの要素を選ぶことは、私が期待するものを作り出すすなわちメニュー[0]が存在し、タグです。それはIEとは少し違って見えますが、それはちょっと違うかもしれません。

私はCrとFFで作業することを祝福されていますので、IEに関する私の経験は限られています。グーグルは私に多くの知恵を与えなかった。

さらにトラブルシューティングを行うにはどうすればよいですか?

+0

でそれを変換することができ、この1

Array.prototype.forEach.call(menu, function(element) { /* ... */ }); 

のように、Array.prototypeからメソッドを借りることができます(そして、IE/SafariはNodeList.forEachをサポートしません。[MDN](https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach)を参照してください)。 –

+0

私が知る限り、 'querySelectorAll'は' HtmlCollection'を返します。これは 'Array'と同じではありませんが、Chromeは内部polyfillを持っている可能性があります。 – Nope

+0

その "祝福"も呪いです:)ブラウザは、そのような内部的な回避策を実装することによって補うと、IEが壊れてしまい、また将来のバージョンで変更されないカスタム実装に依存するようになります:)たとえば、 ChromeがforEachでHtmlCollectionを拡張するためのサポートを継続しているという保証はありません。過去に行ったことがあります:) Internet Explorerは特定のバージョンのIEを含む複数のブラウザをサポートする必要がある場合、おそらく、IEで最初に動作するようになっているのは、その理由からです。 – Nope

答えて

2

基本的にdocument.querySelectorAllは、nodeListという配列をオブジェクトではなく配列として返します。配列関数を呼び出す前に配列に変換する必要があります。ご使用の環境がES6をサポートしている場合

var menus = document.querySelectorAll("ul.application>li>a"); 
menus = [].slice.call(menus); 
menus.forEach(function(element) { ... }); 

その後、あなたはそれはそれはあなたがquerySelectorAllで、オブジェクトのように配列を得るより多くのようなものです、ブラウザの問題ではありませんArray.from()

var menus = document.querySelectorAll("ul.application>li>a"); 
menus = Array.from(menus); 
menus.forEach(function(element) { ... }); 
+0

どのように* [Array.from(menus)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/機能/適用)*関連[Array.apply(null、menus)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from)*?私はドキュメントで説明されているような概念を理解していますが、2人の評判の良いユーザーが2つの異なる提案をしています。それらのうちの1つは時代遅れになるのだろうか?より一般的に使用されますか? –

+0

@KonradVilterstenどちらもお勧めです。 'Array.from'は、iterableオブジェクトを配列に変換する際の困難を避けるために、ES6で導入された専用の関数です。反復可能なオブジェクトの例としては、 'string'、' arguments'などがあります。一方、 'Array.apply('は環境をES6に対応していない場合に変換する方法です。 ES5で変換するには、すべてのメソッドを単一の接続点にするために、Array.fromを導入してください。 –

2

使用することができます。それはNodeListを返します。これは反復可能ですが、配列メソッドを直接使用することはできません。

しかし、あなたは、あなたが最初の本当の配列を取得したい場合は、あなたがのNodeListではないという理由だけで

array = Array.apply(null, menu); 
+0

あなたは**そうです**!IEのコンソールで正確に言いました。私の無知が問題になっているのはなぜですか?FFとCrで動作するのはなぜですか?その翻訳のための魔法が内蔵されていますか –

+0

彼らは言語を拡張しました –

+0

どうすればいいですか? Array.from(メニュー)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)*関連項目* [Array.apply(null、menus)] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/from)*?私はドキュメントに記載されている概念を理解していますが、私は2つのdiffereここでは2人の評判の良いユーザーからの提案と、なぜ私はさまざまな提案をしているのだろうか。それらのうちの1つは時代遅れになるのだろうか?より一般的に使用されますか? –

関連する問題