- document.querySelectorAll
と、
- document.getElementsByTagName
- document.getElementsByClassName
- document.getElementsByName
は、いずれもNodeListを返すメソッドです。
が。返ってくるNodeListは微妙に異なっています。
具体的には、Static NodeList 返ってくるか、Live NodeList が返ってくるかです。
document.querySelectorAllの場合
Static NodeList、すなわちquerySelectorAllを実行した時点でのNodeListが返ってきます。
HTML
<div></div>
JavaScript
const divs = document.querySelectorAll('div'); // divを取得 document.body.appendChild(document.createElement('div')); // 取得後にdivを追加 console.log(divs.length); // 取得時の数(1)が表示される
取得時のNodeListなので、取得後にDOMを操作しても影響はありません。
DEMO
document.getElementsByTagNameの場合
Live NodeListが返ってきます。
HTML
<div></div>
JavaScript
const divs = document.getElementsByTagName('div'); // divを取得 document.body.appendChild(document.createElement('div')); // 取得後にdivを追加 console.log(divs.length); // 現在の数(2)が表示される
Staticではないので、取得後にDOMを操作すると影響がでてきます。
今回はgetElementsByTagNameを例にコードを書きましたが、document.getElementsByClassName、document.getElementsByNameも同様の挙動になります。
DEMO
jsfiddle.net
普段はquerySelectorAllを使うことが多いですが、動的に増える可能性のあるDOMを対象にしたいときなど、たまにLive NodeListが便利な時があるので、覚えておくと便利な仕様です。