高校倫理1433840 views
LaTeX957673 views
中学英語809046 views
中学理科1626729 views
世界の国560930 views
英語608453 views
MathPython492025 views
高校国語785873 views
小学社会308762 views
りんご194232 views
Help
Tools

English

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 を意識する場面は減っています。