innerHTML の使い方と注意点

innerHTML は、要素の中身を HTML 文字列として取得・設定するプロパティです。手軽に HTML を操作できますが、セキュリティには注意が必要です。

基本的な使い方

<div id="container">
  <p>こんにちは</p>
</div>
const container = document.getElementById('container');

// 取得(HTML タグも含む)
console.log(container.innerHTML); // "<p>こんにちは</p>"

// 設定(HTML として解釈される)
container.innerHTML = '<strong>太字</strong>のテキスト';

要素を追加する

既存の内容に追加するには += を使います。

container.innerHTML += '<p>追加された段落</p>';

ただし、+= を使うと既存のイベントリスナーが消えてしまうので注意が必要です。

innerHTML の特徴

HTML として解釈される

文字列に含まれるタグが実際の要素として作成される

既存の内容を置き換える

設定すると、既存の子要素はすべて削除される

実際に動かしてみよう

HTML
CSS
JavaScript
<div id="target">最初のコンテンツ</div>
<button id="replaceBtn">置き換え</button>
<button id="addBtn">追加</button>
#target {
  padding: 15px;
  background: #f5f5f5;
  border: 1px solid #ddd;
  min-height: 50px;
}
const target = document.getElementById('target');

document.getElementById('replaceBtn').addEventListener('click', () => {
  target.innerHTML = '<strong>置き換えられた</strong>コンテンツ';
});

document.getElementById('addBtn').addEventListener('click', () => {
  target.innerHTML += '<br><em>追加されたテキスト</em>';
});

セキュリティの注意(XSS)

ユーザー入力を innerHTML に直接入れると、スクリプトが実行される危険があります。

// 危険な例
const userInput = '<img src="x" onerror="alert(\'XSS\')">';
container.innerHTML = userInput; // XSS 攻撃が成功する

ユーザー入力を表示するときは textContent を使いましょう。

// 安全な例
container.textContent = userInput; // タグがエスケープされる

innerHTML と textContent の使い分け

innerHTML

HTML を埋め込みたいとき。ユーザー入力は危険

textContent

テキストだけを設定するとき。安全

パフォーマンス

大量の要素を追加するとき、ループ内で innerHTML += を繰り返すのは遅いです。

// 遅い
for (let i = 0; i < 1000; i++) {
  container.innerHTML += '<p>項目</p>';
}

// 速い(文字列を組み立ててから一度だけ設定)
let html = '';
for (let i = 0; i < 1000; i++) {
  html += '<p>項目</p>';
}
container.innerHTML = html;

innerHTML は便利ですが、セキュリティとパフォーマンスに気をつけて使いましょう。