JavaScriptを使ってウェブページのコンテンツを操作する際に便利なプロパティの一つがinnerHTML
です。今回は、このinnerHTML
プロパティについてまとめていきたいと思います。
innerHTML
は、HTML要素の中身(HTMLコード)を取得したり、更新したりするためのプロパティです。
- 取得する場合:指定した要素のHTMLコンテンツを文字列として取得できます
- 更新する場合:文字列を代入して、要素のHTMLコンテンツを変更できます
See the Pen Untitled by tones (@tonescodedesign) on CodePen.
// 要素を取得
const div = document.getElementById('example');
const button = document.getElementById('changeText');
// 現在の内容を取得
console.log(div.innerHTML); // 出力: こんにちは!
// ボタンをクリックして内容を変更
button.addEventListener('click', () => {
div.innerHTML = '<strong>新しい内容です!</strong>';
});
<div id="example">こんにちは!</div>
<button id="changeText">テキストを変更</button>
上記のコードでは、ボタンをクリックするとdiv
要素の中身が更新されます。
- 簡単に要素の中身を取得・更新できる。
- HTML構造ごと更新できるため、柔軟性が高い。
- セキュリティリスクがある(XSSの危険性)。
- パフォーマンスが低下する可能性がある。
- アクセシビリティへの配慮が必要。
innerHTML
は便利な反面、使用する際にはいくつかの注意点があります。
innerHTML
を使用してユーザーから入力されたデータをそのまま挿入すると、XSS(クロスサイトスクリプティング)攻撃を受ける可能性があります。
const userInput = `<img src="x" onerror="alert('攻撃')">`;
document.getElementById('example').innerHTML = userInput; // 危険!
このコードでは、ユーザーが悪意のあるスクリプトを含むデータを入力すると、意図しないスクリプトが実行されてしまいます。
対策: ユーザー入力をHTMLとして挿入する場合は、必ずエスケープ処理を行うか、信頼できるデータだけを扱うようにしましょう。
innerHTML
を使用して動的にコンテンツを変更する場合、スクリーンリーダーなどの支援技術が変化を認識できないことがあります。そのため、以下のポイントを意識しましょう。
重要な変更があった場合、適切なARIA属性(例:aria-live
)を設定して支援技術に通知します。
const liveRegion = document.getElementById('liveRegion');
// コンテンツを更新
liveRegion.innerHTML = '更新されたテキストです。';
<div id="liveRegion" aria-live="polite">初期テキスト</div>
視覚的な変更だけでなく、通知やアニメーションを用いてユーザーに変更を伝えます。
innerHTML
を使用して頻繁に大きなコンテンツを更新すると、パフォーマンスが低下する可能性があります。DOMの再構築が頻繁に発生するためです。
その場合、以下のような方法を検討してください。
createElement
やappendChild
を使用する:必要な部分だけを効率的に更新します。- 仮想DOMライブラリの活用:ReactやVue.jsなどのライブラリを使用すると、効率的なDOM操作が可能です。