JavaScript には、任意の要素から最初の子要素を取得するためのさまざまなメソッドが用意されているのですが、どれが最適でしょうか? 最善とは、動作に関しては、最もクロスブラウザー互換性があり、最も高速で、最も包括的で、予測可能であることを意味します。エイリアスとして使用するメソッド/プロパティのリスト:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
これは両方のケースで機能します。
var child = elem.childNodes[0]; // or childNodes[1], see below
これは、フォームまたは<div>
反復の場合です。テキスト要素に遭遇する可能性がある場合:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
私が解決できる限り、firstChild
から NodeList を使用しchildNodes
、 をfirstElementChild
使用しますchildren
。この仮定は、MDN リファレンスに基づいています。
childNode
要素ノードの最初の子要素への参照、またはnull
存在しない場合。
firstElementChild
は実質的に への参照children[0]
であり、children
とにかくオブジェクトは既にメモリ内にあるため、速度に関しては、違いがあったとしても、ほとんどないと思います。
私を投げつけるのはchildNodes
オブジェクトです。テーブル要素でフォームを確認するために使用しました。すべてのフォーム要素をchildren
リストしますchildNodes
が、HTML コードからの空白も含まれているようです:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
両方のログ<TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
すべてのログ<input type="text"
…<コード>>. どうして?1 つのオブジェクトで「生の」HTML コードを操作でき、もう 1 つのオブジェクトで DOM に固執することは理解できますが、childNodes
要素は両方のレベルで機能するようです。
最初の質問に戻ると、私の推測では次のようになります。最も包括的なオブジェクトが必要な場合childNodes
は、その方法ですが、その包括性のために、必要な要素を返すという点で最も予測可能ではない可能性があります/いつでも期待できます。その場合、クロスブラウザーのサポートも課題になる可能性がありますが、私が間違っている可能性もあります。
手元にあるオブジェクトの違いを明確にできる人はいますか? 速度の違いがある場合は、ごくわずかですが、私も知りたいです。これがすべて間違っていると思われる場合は、お気軽に教えてください。
PS: お願い、お願い、私は JavaScript が好きなので、はい、このようなことを扱いたいと思っています。「jQuery はあなたのためにこれを扱っています」のような回答は私が探しているものではないため、jqueryタグはありません。