DOMの「テキスト・内容の取得」— innerText / textContent / innerHTML
innerText / textContent / innerHTMLDOM要素から何を・どういう規則で取り出すかによって、使うプロパティが変わります。代表的なのが innerText、textContent、innerHTML の3つです。ここではそれぞれの意味, 違い, 使いどころ, 注意点を体系的に整理します。
まず結論(比較表)
| 項目 | innerText |
textContent |
innerHTML |
|---|---|---|---|
| 取得対象 | 画面にレンダリングされる文字(見た目重視) | DOM中のテキストノードすべて(構造重視) | 子孫要素のHTML文字列(マークアップ) |
| CSSの影響 | 受ける(非表示・改行・折返し等を反映) | 受けない(display:noneでも文字は取得) |
関係なし(HTMLとして取得) |
| 改行・空白の扱い | レンダリング準拠で空白を圧縮し、ブロック境界などで改行が入る | ソースにあるとおり(余分な空白・改行も保持、余計な改行は追加しない) | HTMLそのもの(タグを含む文字列) |
擬似要素 ::before/::after |
含まれない(DOM外の生成コンテンツ) | 含まれない | 含まれない |
<script>/<style>内の文字 |
通常含まれない(表示されないため) | 含まれる(テキストノードとして存在) | タグを含むHTMLとして取得 |
| パフォーマンス | 遅め:スタイル計算やレイアウトが走りがち | 速い:レイアウト不要 | 中間〜重め(文字列組み立て・パース) |
| 主な用途 | 画面に見えている文字だけ欲しいとき | マシン処理用に純テキストが欲しいとき | マークアップをコピー・差し替えしたいとき |
各プロパティの意味と特徴
innerText
innerText-
**「見た目どおりのテキスト」**を返します。
CSSの影響(display,visibility,white-spaceなど)を考慮し、非表示は除外、空白は人間が読む形に正規化、ブロック要素間で改行が入ることがあります。 -
値を読む際に**レイアウト計算(reflow)**が発生しやすく、要素数が多いとコスト増。
-
使いどころ:ユーザーに見えているテキストだけを収集したい(スクレイピング・ログ出力・可読テキスト抽出など)。
textContent
textContent-
DOMに存在するテキストノードの生テキストを返します。
CSSは無視されるため、非表示要素の文字も含む一方、見た目の改行は追加しません。 -
高速で、単純にテキストが欲しい処理(検索、正規表現処理、エスケープ表示)に向きます。
-
<script>/<style>の内容もテキストとして含まれる点に注意。
innerHTML
innerHTML-
要素配下の**HTML(マークアップ)**を文字列で返します。
タグ構造を持ったまま取得・貼り付け・テンプレート化に使えます。 -
読み取りだけなら安全ですが、書き込み時に外部入力をそのまま渡すのは危険(XSSにつながる)。ユーザー入力を挿入する場合は
textContent等でエスケープしましょう。
ミニサンプル(違いを一度に確認)
-
期待される傾向
-
innerText-
画面に見える「Title」「Hello World」を改行等で読みやすく結合。
-
display:noneの「Hidden Text」や<script>内容は含まれない。
-
-
textContent-
「TitleHello WorldHidden Textvar x = 1;」のように、DOMにある文字を全部結合(空白・改行はソースのまま)。
-
<script>の「var x = 1;」も含まれる。
-
-
innerHTML-
Titleの前後の空白を含むHTML文字列。<p class="visible">Hello <strong>World</strong></p>のようにタグ込みで返る。
-
-
※ 正確な空白・改行はHTMLの書き方(インデントや改行位置)やブラウザ実装に依存します。
よくある用途と選び方
-
見えている文字列だけが欲しい(画面に準拠した抽出)
→innerText -
機械処理用の素のテキストが欲しい(検索、自然言語処理、差分など)
→textContent -
部分HTMLをテンプレートとして扱う/丸ごと差し替える
→innerHTML(※書き込み時はXSS対策必須)
実践パターン
1) ユーザー入力を安全に表示する
-
理由:
textContentはエスケープ済み表示になるため安全。
2) 見えているテキストだけ集計する
-
注意:大量DOMに対する
innerTextはレイアウト計算で重くなる。
3) HTMLフラグメントを複製・差し替えする
-
注意:未知の外部データを
innerHTMLに流し込まない。
細かな挙動のポイント
-
非表示要素
-
innerTextはdisplay:noneや(多くのケースで)visibility:hiddenのテキストを含めない。 -
textContentは含める(CSS無視)。
-
-
空白と改行
-
innerTextは人間の見た目に寄せて空白を圧縮・改行を挿入。 -
textContentはDOMのテキストノードのまま。ブロック要素の間に自動で改行は入らない。
-
-
擬似要素の内容(
content)-
いずれも含まれない(DOM外の生成コンテンツ)。
-
-
要素の種類
-
innerTextは主に HTMLElement に定義。 -
textContentは Node 全般に定義(Document,Textなどでも可)。 -
innerHTMLは Element/DocumentFragment で利用(Textにはない)。
-
-
パフォーマンス
-
大きなDOMで頻繁に読むならまず
textContentを検討。
可視テキストが必要なときだけinnerTextを使うと安定する。
-
まとめ(選択ガイド)
-
可視テキストが欲しい → innerText
-
純テキストが欲しい/高速 → textContent
-
HTML構造ごと取りたい → innerHTML
-
書き込み時の安全性:外部由来のデータは textContent で挿入。innerHTML に流し込むのは避ける。
ChatGPT5 生成日:2025/09/11