【JavaScript入門】Liveなオブジェクトと非Liveなオブジェクトの違い

セレクタを使用して要素を取得する場合、使用するメソッドやプロパティにより、Liveなオブジェクト・非Liveなオブジェクトを取得することができます。

以下では、Live・非Liveの違いについて記載しています。

1. Liveなオブジェクト

Live(動的)なオブジェクト とは、取得した要素に変更があった場合、その変更が代入先の変数にも適用されるオブジェクトです。

HTMLCollection オブジェクトが Liveなオブジェクトに該当します。

次の例は、HTMLCollection オブジェクトを返すメソッド getElementsByTagName を使用した場合の振る舞いです。

③ と ⑤ のp要素の数に注目してください。

html

javascript

この例では、④ で新たにP要素を追加すると、変数 selectElems の内容が動的に代わり、⑤で子要素が増えていることが分かります。

このように、live(動的)なオブジェクトは、取得元を参照しているように振る舞います。

2. 非Liveなオブジェクト

非Live(静的)なオブジェクト とは、取得した後に取得元の要素に変更があっても、その変更が代入先の変数に適用されないオブジェクトです。

querySelectorAllメソッドのNodeListオブジェクトが該当します。

全てのNodeListオブジェクトが非Live(静的)な振る舞いをしない点に注意です。
例えば、Node.childNodesプロパティから返されるNodeListは、live(動的)なオブジェクトになります。

次は、querySelectorAll メソッドを使用した例です。
先ほどのliveなオブジェクトの例の getElementsByTagNameメソッド を querySelectorAllメソッドに変更した場合、次のようになります。

javascript

③ と ⑤ の結果から、Live(動的)なオブジェクトとは異なり、非Live(静的)なオブジェクトでは、取得元のDOMが変更されても、代入した変数 selectElems の内容が変わっていないことが分かります。

3. Live・非Liveなオブジェクトを返すメソッド・プロパティ

ざっくりですが、次のようになります。

Liveなオブジェクト(HTMLCollection)を返すメソッド
elem.getElementsByClassName
elem.getElementsByTagName
elem.getElementsByTagNameNS

Liveなオブジェクト(NodeList)を返すプロパティ
Node.childNodes

非Liveなオブジェクト(NodeList)を返すメソッド
elem.querySelectorAll

4. まとめ

Live・非Liveによって振る舞いが大きく違いので、セレクタを指定して要素を取得する際は、意識してメソッド・プロパティを使用することをオススメします。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする