概要: このチュートリアルでは、DOMツリーに新しい要素を作成する際のinnerHTML
とcreateElement()
の違いについて学習します。
1) createElementの方がパフォーマンスが良い
クラスがcontainerであるdiv
要素があるとします。
<div class="container"></div>
Code language: HTML, XML (xml)
要素を作成して追加することで、新しい要素をdiv
要素に追加できます。
let div = document.querySelector('.container');
let p = document.createElement('p');
p.textContent = 'JS DOM';
div.appendChild(p);
Code language: JavaScript (javascript)
以下のように、innerHTML
を使用して要素のHTMLを直接操作することもできます。
let div = document.querySelector('.container');
div.innerHTML += '<p>JS DOM</p>';
Code language: JavaScript (javascript)
要素に属性を追加したい場合、innerHTML
を使用する方が簡潔で短くなります。
let div = document.querySelector('.container');
div.innerHTML += '<p class="note">JS DOM</p>';
Code language: JavaScript (javascript)
しかし、innerHTML
を使用すると、ウェブブラウザはdiv
要素内のすべてのDOMノードを再解析して再作成するため、新しい要素を作成してdiv
に追加するよりも効率が悪くなります。言い換えれば、新しい要素を作成してDOMツリーに追加する方が、innerHTML
よりもパフォーマンスが優れています。
2) createElementの方が安全
innerHTMLのチュートリアルで説明したように、データがデータベースなど信頼できるソースからのものである場合にのみ使用してください。
制御できないコンテンツをinnerHTMLに設定すると、悪意のあるコードが注入され、実行される可能性があります。
3) DOMノードの作成にはDocumentFragmentを使用する
要素のリストがあり、各反復処理で…
let div = document.querySelector('.container');
for (let i = 0; i < 1000; i++) {
let p = document.createElement('p');
p.textContent = `Paragraph ${i}`;
div.appendChild(p);
}
Code language: JavaScript (javascript)
このコードは、各反復処理でスタイルの再計算、ペイント、レイアウトが行われるため、効率的ではありません。
これを克服するために、一般的にDocumentFragment
を使用してDOMノードを作成し、それをDOMツリーに追加します。
let div = document.querySelector('.container');
// compose DOM nodes
let fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
let p = document.createElement('p');
p.textContent = `Paragraph ${i}`;
fragment.appendChild(p);
}
// append the fragment to the DOM tree
div.appendChild(fragment);
Code language: JavaScript (javascript)
この例では、DocumentFragment
オブジェクトを使用してDOMノードを作成し、最後に一度だけフラグメントをアクティブなDOMツリーに追加しました。
DocumentFragmentはアクティブなDOMツリーにリンクされていないため、パフォーマンスに影響を与えません。
詳細はDocumentFragment
チュートリアルをご覧ください。