ナビゲーションをスキップ
codingEverybody
  • HTML
  • CSS
  • JavaScript
  • PHP
JavaScript
  • JavaScriptの紹介
  • typeof演算子
    データ型を確認する
  • 変数の宣言方法と有効範囲
    var・let・constの違いと使い分け
  • 厳格(Strict )モード
    「use strict」を使う
  • スプレッド構文
    オブジェクト値の展開方法
  • 即時実行関数
    使用される理由
  • プロトタイプ(prototype)継承
    オブジェクト指向を理解する新しい方法
  • アロー関数
    アロー関数と通常の関数の違いの理解
  • テンプレートリテラル ― バッククォート
    テンプレートリテラルを使って文字列を扱う
  • for...in 文
    プロパティ(key)で順回できるオブジェクトループ
  • for...of 文
    値(value)で順回できるオブジェクト用ループ
  • for...inとfor...ofの違い
    異なる反復対象と使用目的
  • Array.isArray()関数
    配列型を確認する
  • forEach()関数
    配列の各要素にコールバック関数を適用する
  • map()関数
    配列の要素を処理して新しい配列を作成します。
  • encodeURI()関数
    URL全体をエンコードする場合
  • encodeURIComponent()関数
    URIコンポーネントをエンコードする場合
  • JavaScriptでCSS変数を操作する方法
    CSS変数の取得と設定
  • decodeURI()関数
    encodeURI()でエンコードされたURLのデコード
  • HTMLCollection
    選択されたHTML要素だけを集めたオブジェクト
  • NodeList
    選択されたノードを含むオブジェクト
  • HTMLCollectionとNodeListの比較
    概念と違いを理解する

JavaScript HTMLCollectionとNodeListの比較

前

HTMLCollectionとNodeList

JavaScriptでDOMを操作する際、ウェブページ内で選択された複数のHTML要素が一度に返される場合があります。このとき返される要素の集まりを「DOMコレクション」と呼び、DOMコレクションには HTMLCollectionと NodeListがあります。

この2つのコレクションの概念と、それぞれの共通点および相違点を比較します。

DOMコレクションが2種類存在する理由

JavaScriptでDOMオブジェクトを直接取得して操作する場合、通常は関連する関数を使用して取得します。このとき、DOMを操作する特定の関数の中には、目的の要素を取得する際に、HTMLドキュメント内に同じ要素が1つではなく複数存在する可能性があります。

例えば、HTMLドキュメント内で指定したタグ名の要素を取得するgetElementsByTagName()関数で<div>タグを選択した場合、このタグがドキュメント内に1つだけ存在することもあれば、複数存在する場合もあります。

このとき、JavaScriptでは、指定した要素を取得する際に、選択された要素が複数存在する可能性がある関数の戻り値を、これらの要素をまとめた集合形式のオブジェクトとして返します。このようなオブジェクト形式を一般的に「DOMコレクション」と呼びます。

JavaScriptでは、このDOMコレクションは1つのオブジェクトではなく、HTMLCollectionと NodeListという2種類に分かれています。

なぜDOMコレクションが2種類に分かれているのでしょうか?これは、ウェブの発展とともにJavaScriptの歴史的背景として理解する必要があります。

HTMLCollectionの誕生背景:初期のコレクション

現代的なウェブ以前のJavaScriptは、その使用用途や機能が非常に限定的であり、制約も多くありました。この時代にはDOMの構造も単純であり、いくつかの関数でHTML要素を操作できました。

このような時代に誕生したコレクションがHTMLCollectionです。

NodeListの誕生背景:現代的なコレクション

しかし、ウェブの発展に伴い、JavaScriptの利用や機能が拡張されると、既存のHTMLCollectionだけでは限界があり、より多くの要素を扱えるDOMコレクションが必要になりました。これがNodeListが誕生した理由です。

先ほど説明したように、DOMコレクションは歴史的背景とウェブ技術の発展の過程の中で、HTMLCollectionとNodeListの2種類に分かれることになりました。

初期から存在していたHTMLCollectionは、単純な要素の一覧をリアルタイムで管理することに重点が置かれており、機能的には制限がありました。一方、NodeListは、より複雑で多様なノード構造を扱えるよう設計されており、拡張された機能と現代的な標準に基づいて、ウェブ開発全般で幅広く活用されています。

限定的なHTMLCollectionと拡張されたNodeListをまとめた表
区分 HTMLCollection NodeList
活用範囲 DOMの要素のみを扱うため DOMの要素だけでなく、テキスト、コメント、属性などのノードを扱うため
要素の選択基準 タグ名、クラス名などの限定的な基準 CSSセレクタに基づいて柔軟な選択が可能
使用されるメソッド getElementsByTagName()、getElementsByClassName() querySelectorAll()

上の表を見れば分かるように、HTMLCollectionは、タグ名やクラス名などの単純な基準で要素を取得するために使用され、その用途は限定的です。一方、NodeListは、CSSセレクタに基づき、より多様な方法で要素を選択できるため、現代のウェブ開発ではNodeListの方がはるかに有用で、頻繁に使用されています。

HTMLCollectionとNodeListオブジェクトの比較

では、技術的にもう少し詳しく、HTMLCollectionとNodeListを次の表で比較してみましょう。

HTMLCollectionとNodeListオブジェクトの比較
特徴 HTMLCollection NodeList
使用目的 DOMの要素を扱うため DOMの要素だけでなく
テキスト、コメント、属性などのノードを扱うため
オブジェクトの生成 getElementsByTagName()、
getElementsByClassName()、
その他の複数のメソッドの戻り値
querySelectorAll()、
Node.childNodesの戻り値
DOMの変更を
リアルタイム(またはライブ)で反映
はい
  • querySelectorAll() 使用: いいえ
  • Node.childNodes 使用: はい
類似配列オブジェクト はい はい
スプレッド構文やArray.from()で配列に変換可能 はい はい
for...of文でのループが可能 はい はい
for文でのループが可能 はい はい
forEach()メソッドでループ可能 いいえ はい
lengthプロパティで長さを取得可能 はい はい
利点 DOMの変更を
リアルタイム(またはライブ)で反映
(ただし、for文を使用する際は注意が必要)
  • querySelectorAll()メソッドはCSSセレクタを引数として使用できるため、目的の要素を簡単に操作できる(最大の利点です)
  • 類似配列オブジェクトですが、配列に変換せずともforEach()メソッドでループできるため、扱いやすいです
欠点 クラス名やタグ名でしかオブジェクトを生成できないため、目的の要素を簡単に選択できない不便さがある(最大の欠点です)
  • querySelectorAll()メソッドは、DOMの変更をリアルタイム(またはライブ)で反映しません
  • Node.childNodesプロパティは、DOMの変更をリアルタイム(またはライブ)で反映しますが、作業が煩雑です

HTMLCollectionとNodeListの使用方法および例

下のリンクをクリックして、HTMLCollectionとNodeListの使用方法および例について詳しく確認できます。

  • JavaScriptのHTMLCollectionを理解する
  • JavaScriptのNodeListを理解する

ブラウザ互換性

HTMLCollectionとNodeListのブラウザ互換性
オブジェクト
デスクトップ Chrome
Chrome
デスクトップデスクトップ Edge
Edge
デスクトップ Firefox
Firefox
Safari
Safari
HTMLCollection 1 12 1 1
NodeList 1 12 1 1

仕様書

HTMLCollectionとNodeListの仕様書
仕様書
HTMLCollection DOM Standard
#interface-htmlcollection
NodeList HTMLCollection
#interface-nodelist

参考資料

  • codingCourses:JavaScript HTMLCollection and NodeList Comparison

関連項目

  • JavaScriptのHTMLCollectionを理解する
  • JavaScriptのNodeListを理解する
  • JavaScriptのfor…of :値(value)で順回できるオブジェクト用ループ
  • JavaScriptのforEach()関数とは:概念の整理と使用例
  • JavaScriptのスプレッド構文(Spread Syntax/展開構文)
  • HTML <template> タグ:正しい理解と使い方
前

codingEverybodyは、
すべての人々のためのプログラミング学習書です。
すべての資料と例は、誤りを防ぐために継続的にレビューされていますが、完全な正確性を保証することはできません。
したがって、すべての資料と例を信頼する前に、自分の判断で誤り、バグ、脆弱性がないか慎重にテストし、確認する必要があります。
クリエイティブ・コモンズ 表示 - 表示 4.0 国際 ライセンスのもとで使用できます。

Copyright © codingEverybody. All Rights Reserved.