childrenとchildNodesの違い
JavaScriptにおけるchildrenとchildNodesの違い
childrenとchildNodesはどちらもJavaScriptのDOM(Document Object Model)において、要素の子要素にアクセスするためのプロパティです。しかし、その挙動や包含する要素に若干の違いがあります。
childrenプロパティ
- 要素の直接の子要素のみが含まれます。
- テキストノードやコメントノードは含まれません。
- HTML要素のみを含む配列を返します。
例
<div id="parent">
<p>テキストノード</p>
<span>span要素</span>
</div>
const parentElement = document.getElementById('parent');
// childrenプロパティ
console.log(parentElement.children); // Output: [<p>, <span>]
// childNodesプロパティ
console.log(parentElement.childNodes); // Output: [<p>, Text node, Comment node, <span>]
要約
- childNodes
要素のすべての直接の子要素を含む配列。 - children
要素の直接の子要素のうち、HTML要素のみを含む配列。
選択基準
- HTML要素のみが必要な場合は、childrenを使用します。
- テキストノードやコメントノードを含める必要がある場合は、childNodesを使用します。
childrenとchildNodesの違い:コード例
HTML構造
<div id="parent">
<p>テキストノード</p>
<span>span要素</span>
</div>
JavaScriptコード
const parentElement = document.getElementById('parent');
// childrenプロパティ:HTML要素のみを含む配列
console.log('children:', parentElement.children);
// childNodesプロパティ:すべての直接の子要素を含む配列
console.log('childNodes:', parentElement.childNodes);
出力結果
children: [<p>, <span>]
childNodes: [<p>, Text node, Comment node, <span>]
解説
- childNodesプロパティ
[<p>, Text node, Comment node, <span>]
が出力されます。childNodes
は要素のすべての直接の子要素を含む配列を返します。テキストノードやコメントノードも含まれます。
- childrenプロパティ
[<p>, <span>]
が出力されます。children
はHTML要素のみを含む配列を返します。テキストノードやコメントノードは含まれません。
具体的な使用例
- すべての直接の子要素を操作する場合
for (let i = 0; i < parentElement.childNodes.length; i++) { if (parentElement.childNodes[i].nodeType === Node.TEXT_NODE) { parentElement.childNodes[i].nodeValue = '変更されたテキスト'; } }
- HTML要素のみを操作する場合
parentElement.children[0].textContent = '変更されたテキスト';
childrenとchildNodesの代替的なアプローチ
querySelectorAll()メソッド
- テキストノードやコメントノードを除外したい場合は、適切なセレクターを使用します。
- CSSセレクターを使用して、複数の要素を一度に取得できます。
const paragraphs = document.querySelectorAll('p');
const spans = document.querySelectorAll('span');
firstChildとlastChildプロパティ
- 最初の子要素または最後の子要素に直接アクセスできます。
const firstChild = parentElement.firstChild;
const lastChild = parentElement.lastChild;
previousSiblingとnextSiblingプロパティ
- 現在の要素の前または後の兄弟要素にアクセスできます。
const previousSibling = element.previousSibling;
const nextSibling = element.nextSibling;
childElementCountプロパティ
- 要素の子要素の数を取得します。
const childCount = parentElement.childElementCount;
適切な方法の選択
- 子要素の数を取得する場合
childElementCount
が適しています。 - 兄弟要素を操作する場合
previousSibling
またはnextSibling
が適しています。 - 最初のまたは最後の要素にアクセスする場合
firstChild
またはlastChild
が適しています。 - 特定の要素をターゲットにする場合
querySelectorAll()
またはgetElementById()
が適しています。
注意
previousSibling
とnextSibling
は要素の兄弟要素のみを返します。firstChild
とlastChild
はテキストノードやコメントノードを含む場合があります。
javascript dom