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);
// → <script>alert...</script> として表示される
// 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 & B < C として表示
// 取得時: text()はHTMLエンティティをデコードして返す
// 要素内が「<div>」の場合
var raw = $('#el').text(); // → '<div>' (デコードされた値)
var html = $('#el').html(); // → '<div>' (エンティティのまま)
// 文字列をエスケープしてHTMLに埋め込む(text()の内部処理と同等)
function escapeHtml(str) {
return $('<div>').text(str).html();
}
console.log(escapeHtml('<script>')); // → <script>
});
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)を表示したいです。
A
text() はテキストを設定しますが、HTMLの改行は <br> です。テキスト内の \n を <br> に変換して html() で設定するか、CSSで white-space: pre-wrap を設定すると \n が改行として表示されます。Qtext()で太字などHTMLタグを含めたいです。
A
text() はHTMLタグをエスケープするため、タグが文字として表示されます。HTMLを含む内容を設定したい場合は html() を使いますが、ユーザー入力を含む場合は必ずサニタイズしてください。信頼できるコンテンツのみ html() に渡してください。Qテキストが空かどうかを確認したいです。
A
$(el).text().trim() === "" で空かどうかを確認できます。.trim() を使うことで、スペースや改行だけの場合も空と判定できます。QtextContent と innerText の違いは?
A
textContent はDOMの全テキストノードを返し、非表示要素も含みます。innerText は画面に表示されているテキストのみを返し、display:none の内容は除外されます。jQueryの text() は内部的に textContent を使います。Q要素内の特定のテキストだけを変更したいです。
A子要素を含むHTMLの一部テキストだけを変更する場合は、テキストノードを直接操作します。または変更したいテキストを
<span> で囲んでIDを付け、$("#target").text(newValue) とする方がシンプルです。テキストノードの直接操作は document.createTreeWalker() などを使いますが複雑です。

