【jQuery】attr()でHTML属性を取得・設定・削除する完全ガイド|prop()との違いも解説

【jQuery】attr()でHTMLの属性操作を行う方法 jQuery

jQueryの attr() メソッドはHTML要素の属性を取得・設定・削除できます。srchrefdata-* など様々な属性を操作できますが、checkeddisabled などのプロパティとは使い方が異なります。本記事では attr() の全機能と prop() との使い分けを解説します。

この記事でわかること

  • attr()で属性を取得・設定する方法
  • removeAttr()で属性を削除する方法
  • 複数属性を一括設定する方法
  • attr()とprop()の違いと使い分け
  • data-*属性の操作方法
スポンサーリンク

1. 属性の取得

// 単一属性の取得
var src  = $('img').attr('src');
var href = $('a').attr('href');
var id   = $('.box').attr('id');

// data属性の取得
var val  = $('#item').attr('data-value');  // 文字列で返る

// 複数要素がある場合は最初の要素の属性を返す
var firstSrc = $('img').attr('src');  // 最初のimgのsrcのみ

2. 属性の設定

// 単一属性の設定
$('img').attr('src', '/images/new.jpg');
$('a').attr('href', 'https://example.com');
$('input').attr('placeholder', '入力してください');

// 複数属性を一括設定(オブジェクト形式)
$('a').attr({
  href: 'https://example.com',
  target: '_blank',
  rel: 'noopener noreferrer'
});

// 関数で設定(現在値を利用して変換)
$('img').attr('src', function (index, currentSrc) {
  return currentSrc.replace('small', 'large');  // ファイル名を置換
});

3. 属性の削除

// 属性の削除
$('a').removeAttr('target');       // target属性を削除
$('input').removeAttr('disabled'); // disabled属性を削除

// 複数属性を一括削除(スペース区切り)
$('a').removeAttr('target rel');

4. attr()とprop()の違い(重要)

HTMLの「属性(attribute)」と「プロパティ(property)」は別物です。checkeddisabledselected などは状態を表すプロパティなので prop() を使います。

// チェックボックスの状態取得
// × attr()だと常に初期値のHTML属性を返す
var wrong = $('input[type="checkbox"]').attr('checked'); // 'checked' or undefined

// ◯ prop()で現在の状態を取得
var isChecked = $('input[type="checkbox"]').prop('checked'); // true / false

// チェックボックスのON/OFF設定
$('input').prop('checked', true);    // チェックをON
$('input').prop('checked', false);   // チェックをOFF
$('input').prop('disabled', true);   // 無効化
$('select option:first').prop('selected', true); // 最初のオプションを選択
操作対象 attr() prop()
src, href, id, class ◯ 推奨 ×
data-*, aria-* ◯ 推奨 ×
checked, selected △ 初期値のみ ◯ 現在値
disabled, readonly △ 文字列”disabled” ◯ true/false

5. data-*属性の操作

カスタムdata属性は attr() でも操作できますが、jQueryの .data() メソッドを使うとより便利です。

// attr()でdata属性を読み書き
var val  = $('#el').attr('data-id');  // 'attr'-が常に文字列
$('#el').attr('data-id', 'new-value');

// .data()でdata属性を読み書き(型変換あり・DOMに反映されない)
var num  = $('#el').data('id');       // 数値なら自動変換: 42
$('#el').data('id', 99);             // DOMには反映されないがjQuery内部に保存
.data()で変更してもDOMのdata属性は更新されない
.data("key", value) での書き込みはjQueryの内部キャッシュに保存されます。実際のHTMLのdata属性(data-key="...")を更新したい場合は必ず .attr("data-key", value) を使ってください。

6. 実用パターン集

// 画像のsrcを動的に変更(ローディング後に切り替え)
$('.lazy-img').attr('src', function (i, old) {
  return $(this).attr('data-src');
});

// リンクのtargetを一括設定(外部リンクのみ新タブ)
$('a[href^="http"]').attr({ target: '_blank', rel: 'noopener noreferrer' });

// inputのplaceholderを多言語切り替え
$('#lang-btn').on('click', function () {
  $('input[name="search"]').attr('placeholder', '検索...');
});

// フォームのactionを動的に変更
$('select[name="country"]').on('change', function () {
  var country = $(this).val();
  $('form').attr('action', '/submit/' + country);
});

まとめ

jQueryの attr() はHTMLの属性値を取得・設定・削除する汎用メソッドです。srchrefdata-* などの通常属性に使い、checkeddisabled などの状態プロパティには prop() を使うのが正しい使い分けです。

関連記事: jQueryのdata属性の取得・設定・受け渡し完全ガイド / jQueryでname属性の値を取得・変更する方法

よくある質問(FAQ)

Qattr()とprop()の使い分けを教えてください
AHTMLの属性(src, href, id, data-*など)には attr()、要素の状態・プロパティ(checked, disabled, selected)には prop() を使います。チェックボックスの現在の状態取得には prop("checked") が正確です。
Q複数の属性を一括設定するには?
Aattr({ key1: val1, key2: val2 }) のようにオブジェクト形式で渡すと複数属性を一括設定できます。
Q属性を削除するにはどうすればいいですか?
AremoveAttr("属性名") を使います。複数の属性を削除するにはスペース区切りで removeAttr("target rel") と書きます。
Qdata属性はattr()とdata()どちらで操作すべきですか?
A読み取りはどちらでも可能ですが、data() は型変換を自動で行います。書き込む場合、data() はDOMを更新しないため、HTMLに反映させたい場合は attr("data-xxx", value) を使ってください。
Qattr()で取得した値が undefined になります
A対象の要素が存在しないか、その属性が設定されていない場合に undefined が返ります。まずセレクタが正しいか、.length で要素の存在を確認してください。