html要素にデータ(プロパティ名と値)、objectオブジェクト(連想配列)を指定できるjqueryのdataメソッドについて質問です。
html要素に変数や連想配列を指定できるということにピンとこないのですが、html要素に変数や連想配列を指定することでどのような長所や利用方法がありますか。
下記のページ以外での利用方法や長所が知りたいです。
http://www.jquerystudy.info/reference/data/data.html
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/28 09:41
回答4件
0
ベストアンサー
例えば、html自体にデータや状態を持たせたい時に使ったりします!
データを持たせたいとかいまいち意味不明だと思うので例を出しますね!
下にdataを使用した例を書いてみます!
例えば一般的なタブ切り替えのレイアウト、機能を作ってみます。
具体的には3タブの下に、選択しているタブの詳細を表示するブロックがある感じです。(分かりづらかったらすいません)
それをjavascriptを使用して切り替えたいみたいな実装をするとします。
基本となるhtmlコードは
html
1<div class="tabs" id="js-tabs"> 2 <div class="tab is_active">タブ1</div> 3 <div class="tab">タブ2</div> 4 <div class="tab">タブ3</div> 5</div> 6<div class="tab-contents" id="js-tabs"> 7 <div class="tab-content is_active">タブ1の中身</div> 8 <div class="tab-content">タブ2の中身</div> 9 <div class="tab-content">タブ3の中身</div> 10</div>
みたいな感じですね!
それで、タブ1、タブ1の中身を最初は表示しておきます。
上のhtmlに追加してcssを追加します!
css
1.tab{display:none;} 2.tab.is_active{display:block;} 3.tab-content{display:none;} 4.tab-content.is_active{display:block;} 5/*基本はdisplay noneで消してますが、選択しているタブ、タブの詳細に関してはis_activeを使用して表示する*/ 6/*本当はfloatとか色々デザインが必要ですが今回は機能面で使用するcssのみ書いてます!*/ 7
次にjavascriptを用いてクリックした時にタブとタブの詳細を切り替える機能を作ります。
この時動作として必要な情報は
- タブをクリックした時に、「どのタブ」をクリックしたか
です
このような情報はhtmlのどこに持たせておけばいいのかというと、いろんな方法があります。
例えば、cssのclassにもたせておくというのも一つの方法です。
ただ、classにjavascriptで持たせる情報を書いてしまうと、
デザイン修正のためにclassを変更 ↓ あれ?javascript動かなくなった。。。 ↓ あ、今変更したclass名をjavascriptが使ってたのかーーー
みたいなことになりかねません。
なので、レイアウトではない情報をclassに持たせるのは極力避けたいです。
なので、できれば情報や状態はdata属性に持たせたほうがいいんです。(他にもやり方は色々ありますが)
なので今回の場合だと、
タブにdata属性を持たせて、タブ詳細にそれぞれのclassを追加します。
(タブ詳細にjs-...というclass名を使用していますが、個人的な命名規則です、js-とすることでこれはjavascriptに使うclassだよーとしています。)
html
1<div class="tabs"> 2 <div class="tab is_active" data-tab="tab1">タブ1</div> 3 <div class="tab" data-tab="tab2">タブ2</div> 4 <div class="tab" data-tab="tab3">タブ3</div> 5</div> 6<div class="tab-contents"> 7 <div class="tab-content js-tab1-content is_active">タブ1の中身</div> 8 <div class="tab-content js-tab2-content">タブ2の中身</div> 9 <div class="tab-content js-tab3-content">タブ3の中身</div> 10</div>
javascript
1$('.tab').on('click', function(){ 2 //$(this)を何回も使うので変数にまとめる 3 var $this = $(this); 4 5 //どのタブ押したか習得、タブ1をクリックするとtab1が取得される 6 var tabType = $this.data('tab'); 7 8 //タブを全て非表示にする 9 $('.tab').removeClass('is_active'); 10 //選択したタブだけ表示する 11 $this.addClass('is_active'); 12 13 //タブ詳細を全て非表示にする 14 $('.tab-content').removeClass('is_active'); 15 16 //選択しているタブのclassを作る(ここ汚いですが) 17 var selectedTabDetail = '.js-' + tabType + '-content'; 18 //選択しているタブの詳細を表示にする 19 $(selectedTabDetail).addClass('is_active'); 20})
みたいな感じです。
結論として、
data属性を使用するメリットはclassなどのレイアウトを担当する部分を汚染すること無く、情報、状態をhtmlに持たせることが出来ることだと思います。
ちなみに、data属性を使用する場合、
.data('tab')と
.attr('data-tab')
の2つがあるのですが、できれば後者のattrを使用するほうが後々楽になったりバグが発生しなくなります。
data()を使用するとその後にdataを取得しても更新されない等(キャッシュされてしまって更新されない)の不具合?がおきてしまうので!
長くなってしまってすいません!
投稿2016/03/24 00:15
総合スコア1869
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/28 10:30
2016/03/28 13:52
2016/03/29 03:12
0
変数や連想配列を指定することもできますが、処理で使用したい「文字列」や「数値」をそのまま入れておくのが基本的な使い方だと思います。
html
1<div data-sample="1" data-group="human"> 2<div data-sample="2" data-group="human">
data-sampleの番号で絞り込んだり、中の数値を利用したり、
data-groupに同じ文字列が入っているもので要素を絞り込んだり、などですね。
投稿2016/03/28 16:09
総合スコア2092
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
よく使うやつ。これだけでアコーディオンになるのです。
jQuery
1$(selector).on("click", function(){ 2 if($(this).data("toggle") === "close"){ 3 $(this).data("toggle", "open"); 4 $(target).slideDown(500); 5 } else { 6 $(this).data("toggle", "close"); 7 $(target.slideUp(500); 8 } 9});
投稿2016/03/23 11:59
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。