数学講師2873614 views
英語611293 views
ヒストリア287936 views
LaTeX960097 views
高校物理159249 views
小学理科718778 views
高校化学2919622 views
教育149270 views
高校国語787186 views
いろは3002230 views

nodeType でノードの種類を判定する

nodeType は、ノードの種類を数値で返すプロパティです。テキストノードと要素ノードを区別したいときに使います。

nodeType の値

DOM には様々な種類のノードがあり、nodeType で判別できます。

定数名説明
1ELEMENT_NODE要素(div, p など)
3TEXT_NODEテキスト
8COMMENT_NODEコメント
9DOCUMENT_NODEdocument
11DOCUMENT_FRAGMENT_NODEDocumentFragment

基本的な使い方

const element = document.getElementById('target');
console.log(element.nodeType); // 1(Element)

const text = element.firstChild;
console.log(text.nodeType); // 3(Text)かもしれない

定数を使った判定

数値で比較するより、定数を使うと読みやすくなります。

if (node.nodeType === Node.ELEMENT_NODE) {
  console.log('これは要素です');
}

if (node.nodeType === Node.TEXT_NODE) {
  console.log('これはテキストノードです');
}

childNodes をフィルタする

childNodes から要素だけを取り出すときに使えます。

const parent = document.getElementById('container');
const elements = [];

for (const node of parent.childNodes) {
  if (node.nodeType === Node.ELEMENT_NODE) {
    elements.push(node);
  }
}

ただし、これは children を使えば同じことができます。

// こちらのほうがシンプル
const elements = parent.children;

実際に動かしてみよう

HTML
CSS
JavaScript
<div id="container">
  テキスト1
  <span>スパン要素</span>
  テキスト2
  <!-- コメント -->
  <p>段落要素</p>
</div>
<button id="btn">ノードを調査</button>
<pre id="result"></pre>
document.getElementById('btn').addEventListener('click', () => {
  const container = document.getElementById('container');
  const result = [];
  
  container.childNodes.forEach((node, i) => {
    let type = '';
    if (node.nodeType === 1) type = 'ELEMENT';
    if (node.nodeType === 3) type = 'TEXT';
    if (node.nodeType === 8) type = 'COMMENT';
    result.push(i + ': ' + type);
  });
  
  document.getElementById('result').textContent = result.join('\n');
});

nodeName と tagName

ノードの種類を調べる別の方法として nodeNametagName があります。

element.nodeName;  // "DIV"(要素なら大文字のタグ名)
element.tagName;   // "DIV"(Element のみ)

textNode.nodeName; // "#text"
textNode.tagName;  // undefined

いつ nodeType を使うか

childNodes を処理するとき

テキストやコメントを除外したい場合に便利

汎用的な関数を作るとき

受け取ったノードが Element かどうかを確認する

ただし、最近は childrenfirstElementChild などの Element 専用プロパティを使えば、nodeType を意識する場面は減っています。