\r\n\t\r\n\r\n\r\n\r\n```\r\n\r\n**./app.js**\r\n```js\r\n$(document).on('click', '[data-trigger]', function() {\r\n\tlet targetValue = $(this).data('trigger');\r\n\tconsole.log(targetValue); // <= 押されたボタンの値は取れていました\r\n\tlet post = '[data-post]';\r\n\tlet target = $(post).data('post')[2].targetValue; // <= ここがうまく行っていません\r\n\r\n\t// 押されたタブへのクラス付与\r\n\t$('[data-trigger]').removeClass('js-active');\r\n\t$(this).addClass('js-active');\r\n\r\n\t// タブで絞り込み\r\n\t$(post).hide()\r\n\t$(target).show();\r\n});\r\n```\r\n\r\n`let target = $(post).data('post')[2].targetValue;` の記述が間違っているためにうまく動作しない様なのですが、試したこととしてそのまま載せております。\r\n押されたボタンの値を3番目に持っている要素を `target` に入れられれば動作する見込みなのですが…\r\nご助力いただけますと幸いです。\r\n\r\n## 補足 : 属性値を配列にしている理由\r\n\r\nこれまで下記のように複数の `data-*` 属性を指定していました。\r\n- `data-postDate` : 日付の絞り込みのため\r\n- `data-postStatus` : 公開前の記事チェックのため\r\n\r\n今回新たに、投稿者による絞り込み機能を追加することが決定したのですが単純に `data-*` 属性を追加すると冗長になってしまうことや、今後、他のページでも属性値を取得して何かしらの処理を加えるといった改修案があるため、一つの `data-*` 属性にまとめられないかという意見のもと、試している次第です。\r\n\r\nそのため、要件が満たせるのであれば下記のように配列ではなくオブジェクトの形式でも構いません。\r\n\r\n`data-post='{\"date\":\"20180212\",\"status\":\"publish\",\"author\":\"admin\"}'`\r\n\r\nただしこの場合、記述量が長くなるため、できれば配列で実現したいと考えております。","answerCount":1,"upvoteCount":0,"datePublished":"2018-06-06T09:16:49.668Z","dateModified":"2018-06-06T09:54:24.555Z","acceptedAnswer":{"@type":"Answer","text":"こんな感じです\r\n\r\n```javascript\r\n\r\n$(function(){\r\n $('button[data-trigger]').on('click',function(){\r\n var trigger=$(this).data('trigger');\r\n var obj=$('article[data-post]').filter(function(){\r\n return $(this).data('post')[2]==trigger;\r\n });\r\n console.log(obj.get());\r\n });\r\n});\r\n\r\n```","dateModified":"2018-06-06T10:00:57.923Z","datePublished":"2018-06-06T10:00:57.923Z","upvoteCount":3,"url":"https://teratail.com/questions/129842#reply-197199"},"suggestedAnswer":[],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"JavaScriptに関する質問","url":"https://teratail.com/tags/JavaScript"},{"@type":"ListItem","position":3,"name":"JavaScript","url":"https://teratail.com/tags/JavaScript"}]}}}
質問するログイン新規登録
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

425閲覧

data属性の値に配列を使用している場合、n番目が特定の値である要素を取得したい。

Bonito_Bonito

総合スコア67

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/06/06 09:16

編集2018/06/06 09:54

0

0

実現したいこと

カスタムデータ属性(data-*)の値に、下記のような配列を使用しております。
<article data-post='["20180212","publish","admin"]'>...</article>

ボタンを押した際、そのボタンの data-trigger の値と、各<article>のうち data-post の3番目の値とが一致している<article>のみに絞り込んで表示したいです。

./index.html

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <title>Popular post</title> 6</head> 7<body> 8 9 <h1>Popular post</h1> 10 11 <button data-trigger='admin'>管理人</button> 12 <button data-trigger='k_kaneda'>兼田</button> 13 14 <article data-post='["20180222","publish","k_kaneda"]'> 15 <h2>投稿タイトルが入ります。ダミーテキスト</h2> 16 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur pariatur, laboriosam commodi placeat temporibus aperiam.</p> 17 <a href="">続きを読む</a> 18 </article> 19 20 <article data-post='["20180212","publish","admin"]'> 21 <h2>投稿タイトルが入ります。ダミーテキスト</h2> 22 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur pariatur, laboriosam commodi placeat temporibus aperiam.</p> 23 <a href="">続きを読む</a> 24 </article> 25 26 <article data-post='["20160308","publish","nonchan"]'> 27 <h2>投稿タイトルが入ります。ダミーテキスト</h2> 28 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur pariatur, laboriosam commodi placeat temporibus aperiam.</p> 29 <a href="">続きを読む</a> 30 </article> 31 32 <article data-post='["20171106","publish","admin"]'> 33 <h2>投稿タイトルが入ります。ダミーテキスト</h2> 34 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur pariatur, laboriosam commodi placeat temporibus aperiam.</p> 35 <a href="">続きを読む</a> 36 </article> 37 38 <article data-post='["20180422","publish","admin"]'> 39 <h2>投稿タイトルが入ります。ダミーテキスト</h2> 40 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur pariatur, laboriosam commodi placeat temporibus aperiam.</p> 41 <a href="">続きを読む</a> 42 </article> 43 44 <article data-post='["20170424","publish","nonchan"]'> 45 <h2>投稿タイトルが入ります。ダミーテキスト</h2> 46 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur pariatur, laboriosam commodi placeat temporibus aperiam.</p> 47 <a href="">続きを読む</a> 48 </article> 49 50 <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> 51 <script type="text/javascript" src="./app.js"></script> 52 53</body> 54</html>

./app.js

js

1$(document).on('click', '[data-trigger]', function() { 2 let targetValue = $(this).data('trigger'); 3 console.log(targetValue); // <= 押されたボタンの値は取れていました 4 let post = '[data-post]'; 5 let target = $(post).data('post')[2].targetValue; // <= ここがうまく行っていません 6 7 // 押されたタブへのクラス付与 8 $('[data-trigger]').removeClass('js-active'); 9 $(this).addClass('js-active'); 10 11 // タブで絞り込み 12 $(post).hide() 13 $(target).show(); 14});

let target = $(post).data('post')[2].targetValue; の記述が間違っているためにうまく動作しない様なのですが、試したこととしてそのまま載せております。
押されたボタンの値を3番目に持っている要素を target に入れられれば動作する見込みなのですが…
ご助力いただけますと幸いです。

補足 : 属性値を配列にしている理由

これまで下記のように複数の data-* 属性を指定していました。

  • data-postDate : 日付の絞り込みのため
  • data-postStatus : 公開前の記事チェックのため

今回新たに、投稿者による絞り込み機能を追加することが決定したのですが単純に data-* 属性を追加すると冗長になってしまうことや、今後、他のページでも属性値を取得して何かしらの処理を加えるといった改修案があるため、一つの data-* 属性にまとめられないかという意見のもと、試している次第です。

そのため、要件が満たせるのであれば下記のように配列ではなくオブジェクトの形式でも構いません。

data-post='{"date":"20180212","status":"publish","author":"admin"}'

ただしこの場合、記述量が長くなるため、できれば配列で実現したいと考えております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/06 09:54

なんか、buttonのonclickからそのボタンのdata属性から判断したほうがいいような。
Bonito_Bonito

2018/06/06 10:15

たしかに…ありがとうございますm(_ _)m
guest

回答1

0

ベストアンサー

こんな感じです

javascript

1 2$(function(){ 3 $('button[data-trigger]').on('click',function(){ 4 var trigger=$(this).data('trigger'); 5 var obj=$('article[data-post]').filter(function(){ 6 return $(this).data('post')[2]==trigger; 7 }); 8 console.log(obj.get()); 9 }); 10}); 11

投稿2018/06/06 10:00

yambejp

総合スコア118164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2018/06/06 10:02

jQueryのオブジェクトとしてはobjでつかめています getしているのはタグの内容を確認するため
Bonito_Bonito

2018/06/06 10:21

正常に動作しました。 こういうときにfilterを使うのですね… ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問