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属性を取得するにはどうしますか?
A
element.datasetプロパティを使います。document.getElementById("user").dataset.idのように、data-を除いたキャメルケースでアクセスできます。datasetの値は常に文字列です。型変換が必要な場合はJavaScriptのNumber()やJSON.parse()で手動変換してください。まとめ
data-*属性はHTML要素に任意データを埋め込む標準的な仕組み.data()はjQueryキャッシュに保存・自動型変換あり・DOM属性は更新しない.attr("data-key")はDOM属性を直接操作・常に文字列・DOM反映あり- 属性セレクタ(
=/^=/$=/*=)で柔軟な絞り込みが可能 - モーダル制御など実践的な実装でdata属性は非常に有効