テキスト・HTMLの書き換え

textContent innerHTML innerText

要素のテキスト内容やHTMLを動的に変更するプロパティです。セキュリティと用途に応じて使い分けが重要です。

デモ:textContent vs innerHTML

表示結果:

こんにちは、<strong>世界</strong>!

textContent:HTMLタグをそのまま文字列として表示

比較:textContent vs innerHTML vs innerText

プロパティHTMLタグCSS考慮速度XSSリスク用途
textContentエスケープ(文字列)❌ 無視✅ 最速✅ なしテキスト書き換え(推奨)
innerHTML解釈・レンダリング✅ 反映△ 遅い⚠️ ありHTML動的生成(注意が必要)
innerTextエスケープ(文字列)✅ 反映△ 遅い✅ なし表示テキストの取得

コード例

js
const el = document.querySelector('#target');

// textContent:テキストの読み書き(HTMLタグは文字列として扱う)
el.textContent = 'こんにちは!';
console.log(el.textContent); // タグを除いたテキストのみ取得

// innerHTML:HTMLの読み書き(⚠️ ユーザー入力には使わない)
el.innerHTML = '<strong>太字テキスト</strong>';

// innerText:スタイル適用後の表示テキストを取得
// display:none の要素は含まない
console.log(el.innerText);

// ✅ ユーザー入力を安全に挿入するには textContent を使う
const userInput = '<script>alert("XSS")</script>';
el.textContent = userInput; // 安全(文字列として表示)
// el.innerHTML = userInput; // ❌ 危険(スクリプトが実行される)

// outerHTML:要素自身を含むHTMLを取得・置換
console.log(el.outerHTML);  // <div id="target">...</div>
el.outerHTML = '<p>置き換え後</p>'; // 要素ごと置き換え

⚠️ XSS(クロスサイトスクリプティング)に注意

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

js
// ❌ 危険
el.innerHTML = userInput;

// ✅ 安全:DOMPurify ライブラリでサニタイズ
import DOMPurify from 'dompurify';
el.innerHTML = DOMPurify.sanitize(userInput);

// ✅ 最も安全:テキストのみなら textContent を使う
el.textContent = userInput;

NEWsetHTMLUnsafe / getHTML(Chrome 124+)

Declarative Shadow DOM に対応した新しいHTML読み書きAPIです。innerHTML の後継として提案されています。

js
// getHTML: Shadow DOMを含むHTMLを取得
const html = el.getHTML({ serializableShadowRoots: true });

// setHTMLUnsafe: Shadow DOMを含むHTMLを設定
// (名前の通り、信頼できる文字列のみ使用すること)
el.setHTMLUnsafe('<div><template shadowrootmode="open">...</template></div>');

// ✅ 安全版:setHTML(まだ実験的)
// el.setHTML(html); // サニタイズ処理を内包

🤖 AIプロンプトテンプレート

以下のようなinnerHTML / textContent / insertAdjacentHTMLを使ったDOM書き換えのサンプルコードを生成してください:
- textContentを使って安全にテキストを書き換える基本実装
- innerHTMLでHTMLを動的に生成する方法とXSSリスクの注意点
- DOMPurifyを使ったinnerHTMLのサニタイズ処理
- insertAdjacentHTML('beforeend', ...)を使った要素の追加パターン
- outerHTMLを使った要素ごとの置き換えと新しいsetHTMLUnsafe APIの紹介

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。