insertAdjacentHTML の使い方

insertAdjacentHTML は、HTML 文字列を指定した位置に挿入する便利なメソッドです。innerHTML より柔軟で、既存の要素を壊さずに追加できます。

基本的な使い方

element.insertAdjacentHTML(position, html) で、位置と HTML 文字列を指定します。

const container = document.getElementById('container');
container.insertAdjacentHTML('beforeend', '<p>新しい段落</p>');

4つの挿入位置

position には4つの値が指定できます。

<!-- beforebegin -->
<div id="target">
  <!-- afterbegin -->
  既存のコンテンツ
  <!-- beforeend -->
</div>
<!-- afterend -->
位置説明
beforebegin要素の直前(兄弟として)
afterbegin要素の最初の子として
beforeend要素の最後の子として
afterend要素の直後(兄弟として)

実際に動かしてみよう

4つのボタンで、それぞれの位置に追加してみます。

HTML
CSS
JavaScript
<button data-pos="beforebegin">beforebegin</button>
<button data-pos="afterbegin">afterbegin</button>
<button data-pos="beforeend">beforeend</button>
<button data-pos="afterend">afterend</button>
<hr>
<div id="target" style="border:2px solid #333;padding:10px;">
  ターゲット要素
</div>
.added {
  background: #ffeb3b;
  padding: 4px;
  margin: 2px;
}
let count = 0;
document.querySelectorAll('button').forEach(btn => {
  btn.addEventListener('click', function() {
    count++;
    const pos = this.dataset.pos;
    const html = '<div class="added">' + pos + ' #' + count + '</div>';
    document.getElementById('target').insertAdjacentHTML(pos, html);
  });
});

innerHTML との違い

innerHTML

既存のコンテンツを完全に置き換える。イベントリスナーが消える

insertAdjacentHTML

既存のコンテンツを保持したまま追加。イベントリスナーも残る

セキュリティの注意

ユーザー入力をそのまま挿入すると XSS 攻撃を受ける可能性があります。

// 危険な例
const userInput = '<script>alert("XSS")</script>';
element.insertAdjacentHTML('beforeend', userInput);

ユーザー入力を含める場合は、エスケープ処理をするか、createElement + textContent を使いましょう。

関連メソッド

テキストを挿入する insertAdjacentText、要素を挿入する insertAdjacentElement もあります。

element.insertAdjacentText('beforeend', 'テキスト');
element.insertAdjacentElement('beforeend', newElement);