【jQuery】text()でテキストを設定・取得する完全ガイド|html()との違い・XSS対策・複数要素・val()との使い分けまで

【jQuery】要素内のテキストを設定・取得する:text() の基本 jQuery

jQueryの text() メソッドは要素のテキストコンテンツを取得・設定します。似たメソッドの html()val() と混同しやすいですが、用途が異なります。この記事ではtext()の基本・html()との違い・XSS対策・複数要素への一括適用・val()との使い分けまで解説します。

この記事でわかること

  • text()でテキストを取得・設定する基本
  • text()・html()・val()の違いと使い分け
  • text()がXSS対策として優れている理由
  • 複数要素に同時にテキストを設定する
  • テキスト内のHTMLエンティティの扱い
スポンサーリンク

text() の基本的な使い方

$(function () {
  // テキストを取得
  var text = $('#title').text();
  console.log('テキスト:', text); // HTMLタグなしの純テキスト

  // テキストを設定
  $('#title').text('新しいタイトル');

  // テキストをクリア
  $('#message').text('');

  // 関数で設定(現在値を参照できる)
  $('.price').text(function (i, currentText) {
    // 例: 「¥1000」→「¥1,000」に変換
    var num = parseInt(currentText.replace(/[^0-9]/g, ''), 10);
    return '¥' + num.toLocaleString();
  });
});

text() / html() / val() の違い

メソッド 対象 HTMLの扱い 主な使い所
text() テキストノード 自動エスケープ テキストの表示・変更(XSS安全)
html() innerHTML HTMLとして解釈 HTMLを含むコンテンツの挿入
val() フォームの値 エスケープなし input/select/textareaの値
// text() vs html() の違い
var userInput = '<script>alert("xss")<\/script>';

// text(): HTMLタグをエスケープして安全に表示
$('#safe').text(userInput);
// → &lt;script&gt;alert...&lt;/script&gt; として表示される

// html(): HTMLとして解釈(危険!ユーザー入力には使わない)
// $('#unsafe').html(userInput); // XSS脆弱性
ユーザー入力のテキスト表示には必ず text() を使う
html() にユーザー入力をそのまま渡すとXSS脆弱性が生じます。コメント表示・検索結果・APIから取得したデータなど、外部データを表示する際は text() を使ってHTMLエスケープしてください。

複数要素のテキストを扱う

$(function () {
  // 全ての .label 要素に同じテキストを設定
  $('.label').text('更新済み');

  // 複数要素のテキストをまとめて取得(全テキストが結合される)
  var allText = $('li').text();
  console.log('全liのテキスト:', allText); // 全liのテキストが連結

  // 個別に処理するには each() を使う
  $('li').each(function () {
    console.log($(this).text());
  });

  // テキストの一覧を配列で取得
  var texts = $('li').map(function () {
    return $(this).text();
  }).get();
  console.log('テキスト配列:', texts);
});
取得時は全テキストが結合される
$("li").text() で取得すると、全ての li のテキストが結合されます。個別のテキストが必要な場合は .each().map() を使ってください。

HTMLエンティティの扱い

$(function () {
  // 設定時: text()はHTMLエンティティをエスケープする
  $('#el').text('A & B < C'); // → A &amp; B &lt; C として表示

  // 取得時: text()はHTMLエンティティをデコードして返す
  // 要素内が「&lt;div&gt;」の場合
  var raw = $('#el').text(); // → '<div>' (デコードされた値)
  var html = $('#el').html(); // → '&lt;div&gt;' (エンティティのまま)

  // 文字列をエスケープしてHTMLに埋め込む(text()の内部処理と同等)
  function escapeHtml(str) {
    return $('<div>').text(str).html();
  }
  console.log(escapeHtml('<script>')); // → &lt;script&gt;
});

val()との使い分け

$(function () {
  // input/textarea/select の値は val()
  var inputValue = $('input').val();
  $('input').val('新しい値');

  // div/p/span などのテキストは text()
  var labelText = $('label').text();
  $('span').text('更新');

  // 間違いやすい例
  $('input').text('xxx'); // → inputのDOMに.textContent設定されるが機能しない
  $('div').val();        // → undefined が返る(フォーム要素ではない)
});

まとめ

jQueryのtext()のポイントをまとめます。

  • 取得: $("el").text() → HTMLタグなしの純テキスト(エンティティはデコード)
  • 設定: $("el").text("新テキスト") → HTMLをエスケープして安全に表示
  • ユーザー入力の表示は必ず text()html() はXSS危険)
  • フォームの値は val()・テキストノードは text()

関連記事: attr()とprop()の違い・完全ガイド / 要素を別の要素に置き換える完全ガイド

よくある質問(FAQ)

Qtext()で改行(\n)を表示したいです。
Atext() はテキストを設定しますが、HTMLの改行は <br> です。テキスト内の \n<br> に変換して html() で設定するか、CSSで white-space: pre-wrap を設定すると \n が改行として表示されます。
Qtext()で太字などHTMLタグを含めたいです。
Atext() はHTMLタグをエスケープするため、タグが文字として表示されます。HTMLを含む内容を設定したい場合は html() を使いますが、ユーザー入力を含む場合は必ずサニタイズしてください。信頼できるコンテンツのみ html() に渡してください。
Qテキストが空かどうかを確認したいです。
A$(el).text().trim() === "" で空かどうかを確認できます。.trim() を使うことで、スペースや改行だけの場合も空と判定できます。
QtextContent と innerText の違いは?
AtextContent はDOMの全テキストノードを返し、非表示要素も含みます。innerText は画面に表示されているテキストのみを返し、display:none の内容は除外されます。jQueryの text() は内部的に textContent を使います。
Q要素内の特定のテキストだけを変更したいです。
A子要素を含むHTMLの一部テキストだけを変更する場合は、テキストノードを直接操作します。または変更したいテキストを <span> で囲んでIDを付け、$("#target").text(newValue) とする方がシンプルです。テキストノードの直接操作は document.createTreeWalker() などを使いますが複雑です。