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コードを操作できるようにする一方で、他のオブジェクトはDOMに固執することを理解していますが、childNodes
要素は両方のレベルで機能するようです。
私の最初の質問に戻るために、私の推測は次のようになります:最も包括的なオブジェクトが必要な場合、それchildNodes
が方法ですが、その包括性のため、必要な要素を返すという点で最も予測しにくいかもしれません/いつでも期待しています。その場合、ブラウザー間のサポートも課題となる可能性がありますが、私は間違っている可能性があります。
誰かが手元にあるオブジェクトの違いを明確にできますか?速度差があっても無視できる程度であれば、私も知りたい。これがすべて間違っていると思われる場合は、遠慮なく教えてください。
PS:ええと、どうか、私はJavaScriptが好きなので、そうです、この種のことを扱いたいのです。「jQueryがこれを処理します」のような答えは私が探しているものではないため、いいえjquery 鬼ごっこ。