A simple way to read and change custom data (data-* attributes) on HTML elements by using JavaScript’s dataset property.
HTMLに書いたdata-*属性を、JavaScriptのdatasetを使って読み取ったり書き換えたりできるしくみ。小さなデータをHTML要素ごとに持たせたいときに便利。
要点:dataset は、HTMLに書いた data-* 属性を JavaScript から簡単に読み書きできる 特別なプロパティです。
例えば <div data-user="Taro"> と書いたら、div.dataset.user で読めます。
例えば同じことを setAttribute('data-name', 'Taro') と書くこともできますが、dataset.name = 'Taro' の方が短く読みやすく、JSらしい書き方です。
getAttribute/setAttribute より短く、見た目も分かりやすいdata- を自動で外し、ハイフンはキャメルケースに変換ルールはシンプルです。「data- を外す」→「ハイフンで区切る」→「2語目以降の先頭を大文字にする」。
data-user → dataset.userdata-user-name → dataset.userNamedata-item-id → dataset.itemIddata-foo-bar-baz → dataset.fooBarBazHTML
<div id="element"
data-user-name="taro"
data-item-id="42"></div>
JavaScript
const el = document.getElementById('element');
el.dataset.userName; // "taro"
el.dataset.itemId; // "42"
ちなみに、datasetで値を変えると、HTMLのdata-*属性(DOM)も同時に更新されます。開発者ツールで確認すると、変更が反映されているのが分かります。
data-*属性の値を取得する方法です。下記の HTMLから「data-name」の値を取得してみます。
HTML
<div id="element" data-name="test"></div>
idで要素を取得したら、datasetには「data-を外した名前」をそのまま使います。たとえば data-name は dataset.name です。
JavaScript
const element = document.getElementById('element');
element.dataset.name
もし、data-*属性名が「data-user-name」のように複数の単語をハイフンで繋いでいる場合は、ハイフンをキャメルケースに置き換えます。
JavaScript
const element = document.getElementById('element');
element.dataset.userName;
要素に data-*属性を設定(追加)する方法です。下記の HTMLに「data-name」という data-*属性に「test」という値を設定・追加してみます。
HTML
<div id="element"></div>
取得する際と同様に記述して、イコールで値を代入します。
JavaScript
const element = document.getElementById('element');
element.dataset.name = 'test';
もし、「data-user-name」のように複数の単語をハイフンで記述している場合は、キャメルケースに置き換えます。
JavaScript
const element = document.getElementById('element');
element.dataset.userName = 'test';
要素の data-*属性の値を更新する方法です。下記の HTMLの「data-name」が持っている値「test」を「testtest」に更新してみます。
HTML
<div id="element" data-name="test"></div>
設定(追加)する際と同様の記述になります。新しい値を代入することで、カスタムデータ属性の値を更新することができます。
JavaScript
const element = document.getElementById('element');
element.dataset.name = 'testtest';
もし、「data-user-name」のようにハイフンで記述している場合は、キャメルケースに置き換えて更新する値を代入します。
JavaScript
const element = document.getElementById('element');
element.dataset.userName = 'testtest';
dataset の各値は文字列です。数値として使うときは Number(el.dataset.count) のように変換。data-item-id)。dataset.itemId)。datasetで簡単に行えます。el.dataset['userName'])。el.dataset.enabled === 'true'、またはJSON.parse(el.dataset.options)(保存時はel.dataset.options = JSON.stringify(obj))。JavaScript(動的キー)
const el = document.getElementById('element');
// "userName" というキー文字列を動的に使う
const key = 'userName';
el.dataset[key] = 'taro';
console.log(el.dataset.userName); // "taro"
dataset は「要素に付いている data-* の集まり」をまとめて持つオブジェクト(イメージ)です。中身を一気に確認したいときは次のようにします。
JavaScript
const el = document.getElementById('element');
// 一覧で確認(開発者ツールのコンソールに表示)
console.log(el.dataset);
// すべてのキーと値をなめる
Object.keys(el.dataset).forEach((key) => {
console.log(key, el.dataset[key]);
});
ポイント:el.dataset は「data-* をキャメルケース化したキー」と「文字列の値」を持っています。キー名は HTML 側の変更に合わせて反映されます。
注意:data-*はHTMLから誰でも見える場所です。大きすぎるデータや機密情報は入れないでください(必要最小限・短い値にしましょう)。
dataset["data-user"]data- は含めない。dataset.user が正解。dataset.user-namedataset.userName とキャメルケースに。dataset.0namedataset.name0 のようにする。<div dataUser="Taro">data-* で始める(data-user)。data-name="value" のように「data-」を付けます。data-user-name → dataset.userNameNumber() で数値に変換してから計算します。delete element.dataset.name; を使います。JavaScript(空にする vs 完全に消す)
const el = document.getElementById('element');
// 値を「空」にする(属性は残る:data-name="" の状態)
el.dataset.name = '';
// 属性そのものを消す(HTML上からも消える)
delete el.dataset.name;
使い分けの目安:
''(空文字)delete el.dataset.name"123" になります。数値にしたいときは Number() などで変換します。datasetで書き換えてもHTMLに反映されないのはなぜ?datasetで値を変更すると、DOM上のdata-*属性にもすぐ反映されます。もし反映されていないように見えるときは、開発者ツール(Elementsタブ)を更新して確認してみてください。表示が古いまま(キャッシュ表示)になっている場合があります。
datasetでdata-*属性を削除するには?delete element.dataset.name; で削除できます。HTML上の data-name も消えます。data-user-name="太郎" のように短く分かりやすい名前にすると安全です。getAttributeとdatasetの違いは?data-*属性を扱えますが、datasetの方が短く読みやすいです。setAttributeよりも自然に書けるのが利点です。data- を付け忘れたdata-」で始める。例:data-user="Taro"dataset.userNameNumber()で数値変換してから使う。delete element.dataset.name; を使う。dataset.user-name はエラー。キャメルケース(dataset.userName)か、ブラケット記法(el.dataset['userName'])を使う。