【jQuery】data属性の取得・設定・絞り込み完全ガイド|.data()・attr()・セレクタ比較

HTMLのカスタムデータ属性(data-*)は、HTML要素に任意のデータを持たせるための標準的な仕組みです。jQueryではこのdata属性を扱う方法が複数あり、それぞれに特性と使い分けがあります。

この記事では、.data()メソッドと.attr()メソッドによるdata属性の取得・設定、および属性セレクタを使った要素の絞り込み方法を、比較表と実践例を交えて徹底解説します。

この記事でわかること

  • data-*属性の基本的な書き方
  • .data().attr()の違いと使い分け
  • 属性セレクタによる要素の絞り込み(完全一致・前方一致・部分一致)
  • data属性の自動型変換の仕組み
  • data属性を活用したモーダルウィンドウの実装例
スポンサーリンク

HTMLのdata属性の基本書き方

data-*属性は、HTMLの標準仕様(HTML5以降)で定義されたカスタム属性です。data-のあとに任意の名前をつけて、要素に情報を埋め込むことができます。

<div id="user" data-id="123" data-name="田中" data-role="admin">
  田中さんのプロフィール
</div>

<button data-target="#modal1" data-label="詳細を見る">
  開く
</button>

<ul>
  <li data-category="fruit" data-price="150">りんご</li>
  <li data-category="fruit" data-price="200">バナナ</li>
  <li data-category="veggie" data-price="100">にんじん</li>
</ul>
ポイントdata-に続く名前はハイフン区切りで書きます(例: data-user-id)。jQueryの.data()ではキャメルケース(userId)でアクセスできます。

方法1: .data()メソッドで取得・設定

jQuery の .data() は、data属性の値を取得・設定するためのメソッドです。内部的にキャッシュ機構を持ち、高速にデータを扱えます。

取得: $(el).data(‘key’)

<div id="user" data-id="123" data-name="田中" data-score="98.5" data-active="true">
  ユーザー情報
</div>
// 基本的な取得
var id = $("#user").data("id");       // 123 (number型)
var name = $("#user").data("name");   // "田中" (string)
var score = $("#user").data("score"); // 98.5 (number型)
var active = $("#user").data("active"); // true (boolean型)

console.log(typeof id);     // "number"
console.log(typeof active); // "boolean"
.data()の自動型変換.data()は文字列を自動的に適切な型に変換します。数値文字列はnumber、”true”/”false”はboolean、JSONライクな文字列はオブジェクトや配列に変換されます。

設定: $(el).data(‘key’, value)

// .data() で値を設定する
$("#user").data("name", "佐藤");
$("#user").data("score", 75);

// 設定後に取得すると新しい値が返る
console.log($("#user").data("name")); // "佐藤"

// オブジェクトをまとめて設定することも可能
$("#user").data({ name: "鈴木", score: 88 });
重要な注意点.data()で値を設定しても、DOM上のHTML属性(data-name="...")は更新されません。.data()が扱うのはjQueryの内部キャッシュであり、HTMLソースとは独立しています。開発者ツールのElementsタブで属性を確認しても変化しません。

方法2: .attr()メソッドで取得・設定

.attr() は HTML 要素の属性を直接操作するメソッドです。data-*属性も通常の属性として取得・設定できます。

取得: $(el).attr(‘data-key’)

// .attr() での取得 - 必ず文字列で返る
var id = $("#user").attr("data-id");     // "123" (string型!)
var name = $("#user").attr("data-name"); // "田中" (string)

console.log(typeof id); // "string" (.data()と異なる)

設定: $(el).attr(‘data-key’, value)

// .attr() での設定 - DOM属性が実際に更新される
$("#user").attr("data-name", "佐藤");

// DOM上の属性が更新されているので .attr() で取得できる
console.log($("#user").attr("data-name")); // "佐藤"

// 開発者ツールのElementsタブでも変化が確認できる
// → <div id="user" data-id="123" data-name="佐藤" ...>
.attr()はDOM属性を直接更新します。そのため、サーバーサイドで動的に生成したHTML要素の属性を変更して再送信したい場合や、CSSセレクタや他のJavaScriptコードが属性値を参照する場合は.attr()が適切です。

.data()と.attr()の違い比較表

2つのメソッドの違いを整理します。用途に応じて適切に使い分けることが重要です。

比較項目 .data() .attr()
データの保存先 jQueryの内部キャッシュ DOM属性(HTML上)
初期値の読み込み HTML属性から初回読み込み 常にHTML属性から読む
設定後のDOM反映 されない される
返り値の型 自動変換(数値・真偽値・オブジェクト) 常に文字列
パフォーマンス キャッシュにより高速 毎回DOM参照
属性名の書き方 data("userId")(キャメルケースも可) attr("data-user-id")(ハイフン必須)
主な用途 JS内部でのデータ保持・受け渡し HTML属性を更新して外部に反映
使い分けの基準:JavaScriptの処理の中だけでデータを使いまわすなら.data()、HTML属性として変更を反映させたい(CSSセレクタで参照したい・サーバーに送信したいなど)場合は.attr()を選びましょう。

属性セレクタで絞り込む方法

jQueryでは属性セレクタを使って、特定のdata属性を持つ要素だけを絞り込んで取得できます。CSSの属性セレクタと同じ文法で使えます。

完全一致: $([data-key=”value”])

<ul>
  <li data-role="admin">管理者</li>
  <li data-role="user">一般ユーザー</li>
  <li data-role="admin">別の管理者</li>
</ul>
// data-role が "admin" に完全一致する要素を取得
var admins = $("[data-role=\"admin\"]");
console.log(admins.length); // 2

admins.css("color", "red");

前方一致: $([data-key^=”value”])

// data-tag が "btn-" で始まる要素を取得
var btnElements = $("[data-tag^=\"btn-\"]");
btnElements.addClass("button-style");

// 例: data-tag="btn-primary", data-tag="btn-danger" は一致
//     data-tag="icon-btn" は不一致

後方一致: $([data-key$=”value”])

// data-tag が "-end" で終わる要素を取得
var endElements = $("[data-tag$=\"-end\"]");
endElements.hide();

// 例: data-tag="section-end", data-tag="row-end" は一致
//     data-tag="end-section" は不一致

部分一致: $([data-key*=”value”])

// data-info に "example" が含まれる要素を取得
var exampleItems = $("[data-info*=\"example\"]");
exampleItems.addClass("highlight");

// 例: data-info="this is an example", data-info="example-code" は一致
//     data-info="sample" は不一致

複数条件の組み合わせ

// data-category="fruit" かつ data-price が "1" から始まる要素
var cheapFruits = $("[data-category=\"fruit\"][data-price^=\"1\"]");
cheapFruits.css("background", "#e8f5e9");

属性セレクタの比較表

セレクタ マッチ条件 マッチするdata-tag例
[attr="value"] 完全一致 [data-tag="btn"] “btn” のみ
[attr^="value"] 前方一致(先頭が一致) [data-tag^="btn-"] “btn-primary”, “btn-ok”
[attr$="value"] 後方一致(末尾が一致) [data-tag$="-end"] “section-end”, “row-end”
[attr*="value"] 部分一致(どこかに含む) [data-tag*="icon"] “btn-icon”, “icon-home”, “my-icon-set”
[attr] 属性の存在チェック [data-tag] data-tagを持つ全要素
[attr!="value"] 不一致(属性なし含む) [data-tag!="btn"] “btn”以外 + data-tagなし

実践例: data属性を使ったモーダルウィンドウ

data属性の実践的な活用例として、複数のモーダルをdata属性で制御する実装を紹介します。ボタンのdata-target属性に対象モーダルのIDを指定します。

<!-- 複数のボタン: data-target で対象モーダルを指定 -->
<button class="modal-open" data-target="#modal1">プロフィールを見る</button>
<button class="modal-open" data-target="#modal2">お知らせを見る</button>

<!-- モーダルHTML -->
<div id="modal1" class="modal">
  <div class="modal-content">
    <h3>プロフィール</h3>
    <p>田中太郎 / エンジニア</p>
    <button class="modal-close">閉じる</button>
  </div>
</div>

<div id="modal2" class="modal">
  <div class="modal-content">
    <h3>お知らせ</h3>
    <p>新機能をリリースしました。</p>
    <button class="modal-close">閉じる</button>
  </div>
</div>
// モーダルを開く
$(".modal-open").on("click", function() {
  // data-target 属性でどのモーダルを開くか判定
  var target = $(this).data("target"); // "#modal1" or "#modal2"
  $(target).fadeIn(300);
});

// モーダルを閉じる
$(".modal-close").on("click", function() {
  $(this).closest(".modal").fadeOut(200);
});

// 背景クリックでも閉じる
$(".modal").on("click", function(e) {
  if ($(e.target).hasClass("modal")) {
    $(this).fadeOut(200);
  }
});
このパターンのメリット:ボタンごとに個別のクリックイベントを書かず、data-targetで対象を指定するだけでどのボタンからでも任意のモーダルを開けます。ボタンやモーダルが増えてもJavaScriptを変更する必要がありません。

data属性の型変換(数値・真偽値・オブジェクト)

.data()メソッドは、HTML属性の文字列値を自動的に適切なJavaScript型に変換します。一方、.attr()は常に文字列を返します。

<div id="item"
  data-count="42"
  data-price="9.99"
  data-active="true"
  data-tags="[1,2,3]"
  data-info='{"name":"test","value":100}'>
</div>
var $item = $("#item");

// .data() の型変換
console.log($item.data("count"));  // 42          (number)
console.log($item.data("price"));  // 9.99        (number)
console.log($item.data("active")); // true         (boolean)
console.log($item.data("tags"));   // [1, 2, 3]   (Array)
console.log($item.data("info"));   // {name:..}   (Object)

// .attr() は常に文字列
console.log($item.attr("data-count"));  // "42"    (string)
console.log($item.attr("data-active")); // "true"  (string)

// .attr()の返り値を数値として使う場合は変換が必要
var count = parseInt($item.attr("data-count"), 10);
型変換の落とし穴.data()の自動変換に頼りすぎると思わぬ挙動が起きることがあります。たとえばdata-id="007".data()で数値7に変換されます(先頭ゼロが消える)。IDを文字列として保持したい場合は.attr()を使うか、String()で変換してください。

関連記事

jQueryの属性操作や要素の選択・繰り返し処理についてはこちらの記事も参考にしてください。

よくある質問(FAQ)

Q.data()で設定した値が.attr()で取得できません。なぜですか?
A.data()はjQueryの内部キャッシュに値を保存するだけで、DOM上のHTML属性は更新しません。.attr()はDOM属性を参照するため、.data()での変更は反映されません。DOM属性を更新したい場合は.attr("data-key", value)を使用してください。
Qdata属性名にハイフンが含まれる場合(data-user-id)、.data()でどうアクセスしますか?
Aハイフン区切りの名前は、.data()ではキャメルケースに変換してアクセスできます。data-user-idなら.data("userId")data-product-nameなら.data("productName")です。ハイフンつきのまま.data("user-id")とも書けます。
Q属性セレクタで大文字・小文字を区別せずに絞り込めますか?
AjQuery標準の属性セレクタは大文字・小文字を区別します。区別しない絞り込みをしたい場合は、.filter().toLowerCase()を組み合わせる方法があります。例: $("[data-role]").filter(function(){ return $(this).attr("data-role").toLowerCase() === "admin"; })
Q.data()の初回読み込み後にHTMLのdata属性を.attr()で変更した場合、.data()は新しい値を返しますか?
A返しません。.data()は初回アクセス時にHTML属性から値を読み込んでキャッシュします。その後.attr()でDOM属性を変更しても、キャッシュは更新されないため.data()は古いキャッシュ値を返し続けます。常にDOM属性の最新値を取得したいなら.attr()を使ってください。
Qvanilla JS(jQuery不使用)でdata属性を取得するにはどうしますか?
Aelement.datasetプロパティを使います。document.getElementById("user").dataset.idのように、data-を除いたキャメルケースでアクセスできます。datasetの値は常に文字列です。型変換が必要な場合はJavaScriptのNumber()JSON.parse()で手動変換してください。
まとめ

  • data-*属性はHTML要素に任意データを埋め込む標準的な仕組み
  • .data()はjQueryキャッシュに保存・自動型変換あり・DOM属性は更新しない
  • .attr("data-key")はDOM属性を直接操作・常に文字列・DOM反映あり
  • 属性セレクタ(=/^=/$=/*=)で柔軟な絞り込みが可能
  • モーダル制御など実践的な実装でdata属性は非常に有効