JavaScript を使用して既存の HTML 要素に HTML コンテンツを追加する
-
InnerHTMLを使用して新しい HTML ノードを追加することの欠点 - DOM 要素を置き換えずに HTML コンテンツを追加する
-
JavaScript で
appendChild()を使用して HTML コンテンツを追加する -
insertAdjacentHTML()を使用して HTML ノードを追加する
javascript を使用して div または別の HTML 要素に HTML コンテンツを追加するのは簡単です。要素の HTMLElement.innerHTML プロパティを新しい HTML コンテンツで設定できます。ただし、プロセス中に、追加されたすべての動的属性が消去されます。
InnerHTML を使用して新しい HTML ノードを追加することの欠点
HTMLElement.innerHTMLは、要素内の HTML コンテンツを削除してから、新しい HTML を含めて再度追加することで機能します。本質的には、新しいコンテンツを追加するだけでなく、HTML コンテンツを置き換えます。innerHTMLプロパティを使用して新しい HTML 要素を DOM に追加すると、すべての子孫ノードも削除され、新しい HTML コンテンツ(innerHTMLプロパティに割り当てられた HTML 文字列)を解析して作られた新しいノードで置き換えられ、HTML 全体が新しくレンダリングされます。- サイバーセキュリティレビューを受けるプロジェクトで
innerHTMLを使用しているときに、コードが拒否される可能性があることはあまり知られていません。innerHTMlは潜在的なセキュリティリスクを伴う可能性があるため、直接使用しないことをお勧めします(詳細については、MDN リンクを参照してください)。
DOM 要素を置き換えずに HTML コンテンツを追加する
HTML コードの一部を既存の DOM に追加するには、JavaScript の次の組み込み関数を使用できますが、既に添付されている動的コンテンツが失われる心配はありません。
appendChild()insertAdjacentHTML()
JavaScript で appendChild() を使用して HTML コンテンツを追加する
appendChild() は innerHTML と同じ目的を果たします。これらの両方の方法を使用して、HTML コンテンツをノードに追加できます。2つのアプローチの違いは、appendChild() が関数であるのに対し、innerHTML はプロパティであるということです。appendChild() は、innerHTML プロパティによって行われるように DOM のコンテンツを置き換える代わりに、既存の DOM 要素にノードを追加します。
<div>
<div>User Details</div>
<div>
<label>Name:</label>
<input type="text" id="name" placeholder="Name">
</div>
<div id="adress">
<label>Address:</label>
<input type="text" id="contact" placeholder="Address">
</div>
<button id="add_address" onclick="addAddressLine()">Add Address Line</button>
</div>
var lineCount = 0;
addAddressLine = function() {
var i = document.createElement('input');
i.setAttribute('type', 'text');
i.setAttribute('placeholder', 'Address Line ' + ++lineCount);
var addressContainer = document.getElementById('adress');
addressContainer.appendChild(i);
}
上記のコードを使用して、ユーザーの名前と住所を取得するためのフォームを作成しました。通常、アドレスには複数の行があります。したがって、これらの追加の住所行をキャプチャするためにクリックすると、新しい入力フィールドを追加するボタンを作成しました。以下は、新しい入力フィールドを作成するためのプロセスです。
Add Address LineボタンのクリックイベントでaddAddressLine関数を呼び出します。- 関数では、
document.createElement('input')関数を使用して HTMLinputを動的に作成します。i変数に格納された作成済みのinput要素を返します。 - 次に、
setAttribute()メソッドを使用して、作成されたinput変数にtypeおよびplaceholder属性を設定します。 - 既存の
div構造にinput要素を追加する準備ができました。したがって、全体として div 構造を返すdocuemnt.getElementById()を使用してaddressdivをクエリし、JavaScript のappendChild(i)関数を使用します。 appendChild(i)関数は、変数iによって保持される動的に作成されたinput要素を追加し、それをaddressdivの最後に配置します。lineCountを使用して、新しい入力フィールドを追加するたびにプレースホルダー値をインクリメントします。
ノート
- 作成した要素を DOM に追加するために、新しいメソッド
append()を使用することもできます。javascript メソッドappendを使用すると、DOMString(単純な文字列テキスト)を引数として使用でき、値を返しません。Internet Explorer ブラウザは新しいappend()メソッドをサポートしていないことに注意してください。 - Internet Explorer を含むすべての最新の Web ブラウザーは、古い
appendChild()関数をサポートしています。
insertAdjacentHTML() を使用して HTML ノードを追加する
appendChild() および append() 関数でさえ、指定された HTML ノードに新しい要素を追加することができます。これらのメソッドはどちらも、最後の子の後に要素を挿入します。すべてのシナリオで役立つとは限りません。特に、HTML 構造の指定された位置に HTML ノードを追加する場合。このような場合、insertAdjacentHTML() 関数を使用できます。それはいくつかのパラメータ、位置とその位置のテキストを取ります。
-
Position:insertAdjacentHTMLは、position パラメーターで 4つの値をサポートします。beforebegin:要素の開始前に HTML ノードを挿入します。afterbegin:名前が示すように、このオプションは、選択したノードの開始タグの直後に要素を挿入し、最初の子の前に配置します。beforeend:これはappendChild()に似ています。名前が示すように、beforeend位置は要素を最後の子の直後に配置します。afterend:ターゲット HTML ノードタグが閉じた後の位置を指します。
-
String:HTML を文字列形式で 2 番目のパラメータとして挿入できます。例:<div> Hello World!</div>。
一見すると、表現は次のようになります。
<!-- beforebegin -->
<div>
<!-- afterbegin -->
<p>
<!-- beforeend -->
</div>
<!-- afterend -->
JavaScript の insertAdjacentHTML() 関数を使用して appendChild() について説明したのと同じ例を見てみましょう。
<div>
<div>User Details</div>
<div>
<label>Name:</label>
<input type="text" id="name" placeholder="Name">
</div>
<div id="address">
<label>Address:</label>
<input type="text" id="contact" placeholder="Address">
</div>
<button id="add_address" onclick="addAddressLine()">Add Address Line</button>
</div>
var lineCount = 0;
addAddressLine = function() {
var i = document.createElement('input');
i.setAttribute('type', 'text');
i.setAttribute('placeholder', 'Address Line ' + ++lineCount);
var addressContainer = document.getElementById('adress');
addressContainer.insertAdjacentElement('beforeend', i);
}
このコードでは、パラメーターの beforeend オプションを使用して、動的に作成された入力要素を address div の最後に追加しました。afterend、beforebegin、afterbegin パラメーターなどの他の属性を試してみることができます。