こんにちは。でんすけ(@notgeek_densuke)です。
HTMLのタグに好きなデータを付与しておきたい場面があるかと思いますが。
そんな時はカスタムデータ属性を使うといいよ、という話です。
スポンサーリンク
カスタムデータ属性とは
カスタムデータ属性とは、こんなやつです。
<div data-mydata="hogehoge">DIVにhogehogeっていうデータを付けたよ</div>
こんな感じで、HTMLタグの属性には
「data-好きな名前」という形式で、任意の属性を付けることができます。
名前は任意ですが、大文字は使えないことに注意です。
ハイフンで区切ることはできるので、「mydata-first」のような名前はOK。
JavaScriptでのカスタムデータ属性の扱い方
JavaScriptでカスタムデータ属性を扱うには、大きく分けて2つの手段があります。
・datasetを使う
・getAttribute、setAttributeを使う
実例を以下に。
<div id="mydiv" data-mydata="hogehoge" data-mydata-second="foobar">DIVにカスタムデータを付けたよ</div>
<script>
var elem = document.getElementById("mydiv");
/*** カスタムデータ属性からデータの取得 ***/
console.log( "datasetを使う方法:" + elem.dataset.mydata + elem.dataset.mydataSecond );
console.log( "getAttributeを使う方法:" + elem.getAttribute('data-mydata') + elem.getAttribute('data-mydata-second') );
/*** カスタムデータ属性の編集、datasetを使う場合 ***/
elem.dataset.mydata = "rewrite"; //data-mydataを上書き
elem.dataset.mydataThird = "3rd data"; //data-mydata-thirdを新規追加
console.log( "datasetでデータ編集後:" + elem.getAttribute('data-mydata') + elem.getAttribute('data-mydata-third') );
/*** カスタムデータ属性の編集、setAttributeを使う場合 ***/
elem.setAttribute("data-mydata", "ReRewrite"); //data-mydataを上書き
elem.setAttribute("data-mydata-fourth", "4th data"); //data-mydata-fourthを新規追加
console.log( "setAttributeでデータ編集後:" + elem.dataset.mydata + elem.dataset.mydataFourth );
</script>
datasetで扱う場合、ハイフンで区切った直後を大文字にして扱うことになります。
この、単語の区切り部分を大文字にすることはキャメルケースと呼ばれます。
そのルールさえ守れば、datasetでも、set or get Attributeでも、どちらも使い方はそれほど変わらないので、お好きな方で。
jQueryでのカスタムデータ属性の扱い方
jQueryだと
・data()を使う
・attr()を使う
という2種類。
ただ、jQueryでは、データの変更の挙動がちょっと怪しくなります。
こんな感じ。
<div id="mydiv" data-mydata="hogehoge" data-mydata-second="foobar">DIVにカスタムデータを付けたよ</div>
<script>
jQuery(function($){
var $elem = $("#mydiv");
/*** データの取得 ***/
console.log( $elem.data("mydata") );
console.log( $elem.data("mydata-second") );
console.log( $elem.data("mydataSecond") );
console.log( $elem.attr("data-mydata") );
console.log( $elem.attr("data-mydata-second") );
console.log( $elem.data() ); //JSON形式で一気に取得
console.log( $elem.data().mydata );
console.log( $elem.data().mydataSecond );
/*** データの取得だけなら問題なし ***/
/*** 新しいデータの追加 ***/
$elem.data("mydataThird", "3rd data");
$elem.data("mydata-fourth", "4th data");
$elem.attr("data-mydata-fifth","5th data");
console.log( $elem.data("mydata-fifth") ); //5th dataが表示される
console.log( $elem.attr("data-mydata-third") ); //undefined!!
console.log( $elem.attr("data-mydata-fourth") ); //undefined!!
//実際DOMを確認すると<div id="mydiv" data-mydata="rewrite" data-mydata-second="foobar" data-mydata-fifth="5th data">となって、属性が付与されていない
/*** 既存データの書き換え ***/
$elem.attr("data-mydata", "rewrite");
console.log( $elem.data("mydata") ); //書き換えたのにhogehogeのまま!
console.log( $elem.attr("data-mydata") ); //こっちだとrewriteになってる
$elem.data("mydataSecond", "ReRewrite");
console.log( $elem.attr("data-mydata-second") ); //書き換えたのにfoobarのまま!
console.log( $elem.data("mydata-second") ); //こっちだとReRewriteになってる
});
</script>
キャメルケースでもハイフンでも、どちらでも柔軟にやってくれて便利っぽいのですが、
データの書き換えで、ちょっと挙動がややこしい。
jQueryのdata()は、一応カスタムデータ属性からデータを取得できるのですが、
実際にDOMの属性値を書き換えるわけではないっぽい挙動をしています。
jQueryオブジェクト内の「data」属性を書き換えているだけっぽい?
attr()を使ってのDOMの属性値を書き換えることはできますが、
jQueryオブジェクト内の「data」にデータが残っている場合は、それを書き換えないっぽい。
なので、DOMの属性値は書き換わっているけど、jQueryオブジェクト内の「data」を優先して見に行くので
思ったデータが取得できない、という感じ。
せっかく便利っぽいのに、どうもややこしい動きをするので、使う場合は注意が必要です。
値を書き換える場合は、jQueryは使わない方がいいかも。
独自の属性の使い方
さて、カスタム属性、何が便利かというと。
まぁ色んな使い方ができると思いますが。
たとえば、一覧にしたいデータがあったとして。
そこに、IDナンバーや、種類、その他情報を載せておくことができます。
たとえば、スプラトゥーンのブキの一覧があるとして。
<div class="spla-weapon" data-idnum="001" data-type="シューター" data-sub="クイックボム">スプラシューター</div> <div class="spla-weapon" data-idnum="002" data-type="シューター" data-sub="スプラッシュボム">スプラシューターコラボ</div> <div class="spla-weapon" data-idnum="003" data-type="マニューバー" data-sub="クイックボム">スプラマニューバー</div> <div class="spla-weapon" data-idnum="004" data-type="シューター" data-sub="ポイントセンサー">.52ガロン</div>
こんな感じで。
これで、見た目は変えずに、いろんな情報を載せることができます。
例えば、データを使って順番を並べ替えたりも。
<div id="spla-weaponlist">
<div class="spla-weapon" data-idnum="001" data-type="シューター" data-sub="クイックボム">スプラシューター</div>
<div class="spla-weapon" data-idnum="002" data-type="シューター" data-sub="スプラッシュボム">スプラシューターコラボ</div>
<div class="spla-weapon" data-idnum="003" data-type="マニューバー" data-sub="クイックボム">スプラマニューバー</div>
<div class="spla-weapon" data-idnum="004" data-type="シューター" data-sub="ポイントセンサー">.52ガロン</div>
</div>
<button name="idsort">IDでソート</button>
<button name="typesort">種別でソート</button>
<button name="subsort">サブでソート</button>
<script>
jQuery(function($){
$("button[name='idsort']").click(function(){
$("#spla-weaponlist").html(
$(".spla-weapon").sort(function(a,b){
return ($(a).data("idnum") < $(b).data("idnum") ? 1 : -1);
})
);
});
$("button[name='typesort']").click(function(){
$("#spla-weaponlist").html(
$(".spla-weapon").sort(function(a,b){
return ($(a).data("type") < $(b).data("type") ? 1 : -1);
})
);
});
$("button[name='subsort']").click(function(){
$("#spla-weaponlist").html(
$(".spla-weapon").sort(function(a,b){
return ($(a).data("sub") < $(b).data("sub") ? 1 : -1);
})
);
});
});
</script>
若干やっつけなソースですが。。
いずれにせよ、一つのHTMLタグの中に複数の情報を持っておくことができるので、
より動的な操作をしやすくなる、ということです。
まとめ
ということで、カスタムデータ属性の話でした。
なにかと便利なので使ってみてください。
それではまたー。








コメント
コメントはありません。