質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

JavaScript

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

Q&A

解決済

2回答

651閲覧

data-属性に複数のimputを設定し、それを取得してリストを絞り込む方法 [HTML] [JavaScript]

maniandmani

総合スコア1

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

JavaScript

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

0グッド

0クリップ

投稿2022/03/06 00:08

編集2022/03/11 09:23

1. 前提、実現したいこと

国公立/私立 大学の 理系/文系 による学費の違いをプログラミングで表示するシステム(codepen)を作りたいと考えております。
元のhtmlデータはもっと多いですが、質問する際に必要な最低限のコードだけ共有いたします。
ボタンをcheckするごとに表示されるリストがだんだんと少なくなっていき、絞られていくイメージなので、「大学」と「学部」のどちらの項目がcheckされている必要はないです。

プログラミング全くの初心者ですので、

  • htmlの記述で対応できるならそちらを優先したい
  • JSで記述する必要があるのでしたら、具体的にどの部分をどのように記述すれば良いかを教えて頂きたい

JSに関してはほぼ何もわかっていない状況ですので、このコードを使えば?というアドバイスだけでは解決できないレベルです...

2. 発生している問題

**ひとつのdata-属性に関して、複数のimputのどれがcheckされても良いようなコードを知りたいです。
具体的には、「東京大学」「京都大学」のどちらが押されても、国公立大学の理系/文系の学費が表示されて欲しいです。

3. 自分で試したこと

Excelでいう "①" or "②" or "③" のようにできたらいいなと考えていたので、htmlの記述を

html

1<li class="list_item" 2 data-university="tokyo" 3 data-university="kyoto" 4 data-major="science" 5 data-major="engineering" 6 >

html

1<li class="list_item" 2 data-university='["tokyo","kyoto"]' 3 data-major='["science","engineering"]' 4 >

このように試してみましたが、うまくいきません。やはりJSで記述する必要があるのでしょうか。

4. コード

一番最初にcodepenのリンクを共有しましたが、一応こちらにもコードを共有しておきます。

変更後

html

1<form> 2<ul> 3<li> 4<label><input type="checkbox" name="university" value="tokyo">東京大学</label></li> 5<li><label><input type="checkbox" name="university" value="kyoto">京都大学</label></li> 6<li><label><input type="checkbox" name="university" value="keio">慶應大学</label></li> 7<li><label><input type="checkbox" name="university" value="waseda">早稲田大学</label></li> 8</ul> 9<hr> 10<ul> 11<li><label><input type="checkbox" name="major" value="science">理学部</label></li> 12<li><label><input type="checkbox" name="major" value="engineering">工学部</label></li> 13<li><label><input type="checkbox" name="major" value="letters">文学部</label></li> 14<li><label><input type="checkbox" name="major" value="law">法学部</label></li> 15</ul> 16<hr> 17<ul> 18<li><label><input type="checkbox" name="graduate" value="goSame">院進(同大学)</label></li> 19<li><label><input type="checkbox" name="graduate" value="goDiffe">院進(他大学)</label></li> 20<li><label><input type="checkbox" name="graduate" value="work">就職</label></li> 21<li><label><input type="checkbox" name="graduate" value="establish">起業</label></li> 22<hr> 23<ul class="list"> 24 <li class="list_item" 25 data-university='["tokyo","kyoto"]' 26 data-major='["science","engineering"]' 27 data-graduate='["goSame","goDiffe"]' 28 >国公立理系院進学費: xx万円 29 </li> 30 <li class="list_item" 31 data-university='["tokyo","kyoto"]' 32 data-major='["science","engineering"]' 33 data-graduate='["work","establish"]' 34 >国公立理系就職学費: xx万円 35 </li> 36 <li class="list_item" 37 data-university='["tokyo","kyoto"]' 38 data-major='["letters","law"]' 39 data-graduate='["goSame","goDiffe"]' 40 >国公立文系院進学費: xx万円 41 </li> 42 <li class="list_item" 43 data-university='["tokyo","kyoto"]' 44 data-major='["letters","law"]' 45 data-graduate='["work","establish"]' 46 >国公立文系就職学費: xx万円 47 </li> 48 <li class="list_item" 49 data-university='["keio","waseda"]' 50 data-major='["science","engineering"]' 51 data-graduate='["goSame","goDiffe"]' 52 >私立理系院進学費: xx万円 53 </li> 54 <li class="list_item" 55 data-university='["keio","waseda"]' 56 data-major='["science","engineering"]' 57 data-graduate='["work","establish"]' 58 >私立理系就職学費: xx万円 59 </li> 60 <li class="list_item" 61 data-university='["keio","waseda"]' 62 data-major='["letters","law"]' 63 data-graduate='["goSame","goDiffe"]' 64 >私立文系院進学費: xx万円 65 </li> 66 <li class="list_item" 67 data-university='["keio","waseda"]' 68 data-major='["letters","law"]' 69 data-graduate='["work",establish]' 70 >私立文系就職学費: xx万円 71 </li> 72</ul>

JavaScript

1 2document.addEventListener('change',e=>{ 3 const t=e.target; 4 if(t.closest('[name=university],[name=major]')){ 5 const univ=[...document.querySelectorAll('[name=university]:checked')].map(x=>x.value); 6 const majo=[...document.querySelectorAll('[name=major]:checked')].map(x=>x.value); 7 document.querySelectorAll('.list_item').forEach(x=>{ 8 let flg=false; 9 if(univ.length>0 || majo.length>0){ 10 flg=true && 11 (univ.length==0 || JSON.parse(x.dataset.university).filter(y=>univ.indexOf(y)>=0).length) && 12 (majo.length==0 || JSON.parse(x.dataset.major).filter(y=>majo.indexOf(y)>=0).length) 13 } 14 x.toggleAttribute('hidden',!flg); 15 }); 16 } 17}); 18window.addEventListener('DOMContentLoaded', ()=>{ 19 const e = new CustomEvent("HTMLEvents"); 20 e.initEvent('change', true, true ); 21 document.querySelector('[name=univerdocument.addEventListener('change',e=>{ 22 const t=e.target; 23 if(t.closest('[name=university],[name=major],[name=graduate]')){ 24 const univ=[...document.querySelectorAll('[name=university]:checked')].map(x=>x.value); 25 const majo=[...document.querySelectorAll('[name=major]:checked')].map(x=>x.value); 26 const grad=[...document.querySelectorAll('[name=graduate]:checked')].map(x=>x.value); 27 document.querySelectorAll('.list_item').forEach(x=>{ 28 let flg=false; 29 if(univ.length>0 || majo.length>0 || grad.length>0){ 30 flg=true && 31 (univ.length==0 || JSON.parse(x.dataset.university).filter(y=>univ.indexOf(y)>=0).length) && 32 (majo.length==0 || JSON.parse(x.dataset.major).filter(y=>majo.indexOf(y)>=0).length) && 33 (grad.length==0 || JSON.parse(x.dataset.graduate).filter(y=>grad.indexOf(y)>=0).length) 34 } 35 x.toggleAttribute('hidden',!flg); 36 }); 37 } 38}); 39window.addEventListener('DOMContentLoaded', ()=>{ 40 const e = new CustomEvent("HTMLEvents"); 41 e.initEvent('change', true, true ); 42 document.querySelector('[name=university]').dispatchEvent(e); 43});sity]').dispatchEvent(e); 44}); 45 46

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

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

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

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

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

guest

回答2

0

ベストアンサー

jQueryならこんな感じ

javascript

1<script> 2$(function(){ 3 $('.university').on('change',function(){ 4 var vals=$('.university:checked').map(function(){ 5 return $(this).val(); 6 }).get(); 7 $('.list_item').hide().filter(function(){ 8 var flg=$(this).data('university').filter(function(x){ 9 return vals.indexOf(x)>=0; 10 }).length; 11 return flg; 12 }).show(); 13 }).eq(0).trigger('change'); 14}); 15</script> 16<label><input type="checkbox" class="university" value="tokyo">東京</lavel> 17<label><input type="checkbox" class="university" value="kyoto">京都</lavel> 18<label><input type="checkbox" class="university" value="osaka">大阪</lavel> 19<ul> 20<li class="list_item" data-university='["tokyo"]'>東京</li> 21<li class="list_item" data-university='["kyoto"]'>京都</li> 22<li class="list_item" data-university='["osaka"]'>大阪</li> 23<li class="list_item" data-university='["tokyo","kyoto"]'>東京,京都</li> 24<li class="list_item" data-university='["kyoto","osaka"]'>京都,大阪</li> 25<li class="list_item" data-university='["tokyo","osaka"]'>東京,大阪</li> 26<li class="list_item" data-university='["tokyo","kyoto","osaka"]'>東京,京都,大阪</li> 27</ul>

生のjsならこう?

javascript

1<script> 2document.addEventListener('change',e=>{ 3 const t=e.target; 4 if(t.closest('.university')){ 5 const vals=[...document.querySelectorAll('.university:checked')].map(x=>x.value); 6 document.querySelectorAll('.list_item').forEach(x=>{ 7 const flg=JSON.parse(x.dataset.university).filter(y=>vals.indexOf(y)>=0).length; 8 x.toggleAttribute('hidden',!flg); 9 }); 10 } 11}); 12window.addEventListener('DOMContentLoaded', ()=>{ 13 const e = new CustomEvent("HTMLEvents"); 14 e.initEvent('change', true, true ); 15 document.querySelector('.university').dispatchEvent(e); 16}); 17</script> 18<label><input type="checkbox" class="university" value="tokyo">東京</lavel> 19<label><input type="checkbox" class="university" value="kyoto">京都</lavel> 20<label><input type="checkbox" class="university" value="osaka">大阪</lavel> 21<ul> 22<li class="list_item" data-university='["tokyo"]'>東京</li> 23<li class="list_item" data-university='["kyoto"]'>京都</li> 24<li class="list_item" data-university='["osaka"]'>大阪</li> 25<li class="list_item" data-university='["tokyo","kyoto"]'>東京,京都</li> 26<li class="list_item" data-university='["kyoto","osaka"]'>京都,大阪</li> 27<li class="list_item" data-university='["tokyo","osaka"]'>東京,大阪</li> 28<li class="list_item" data-university='["tokyo","kyoto","osaka"]'>東京,京都,大阪</li> 29</ul>

3つ以上

(条件が2つある場合は省略)
datasetの要素をリストで宣言してしまえばいくつでもいけそうです

javascript

1<script> 2document.addEventListener('change',e=>{ 3 const t=e.target; 4 const list=["university","major","graduate"]; 5 if(t.closest(list.map(x=>`[name=${x}]`).join(','))){ 6 const selected={}; 7 list.forEach(x=>selected[x]=[...document.querySelectorAll(`[name=${x}]:checked`)].map(x=>x.value)); 8 document.querySelectorAll('.list_item').forEach(x=>{ 9 let flg=false; 10 if(Object.values(selected).flat().length>0){ 11 flg=list.map(y=>selected[y].length==0||JSON.parse(x.dataset[y]).filter(z=>selected[y].indexOf(z)>=0).length).reduce((x,y)=>x&&y); 12 } 13 x.toggleAttribute('hidden',!flg); 14 }); 15 } 16}); 17window.addEventListener('DOMContentLoaded', ()=>{ 18 const e = new CustomEvent("HTMLEvents"); 19 e.initEvent('change', true, true ); 20 document.querySelector('[name=university]').dispatchEvent(e); 21}); 22</script> 23<form> 24<ul> 25<li> 26<label><input type="checkbox" name="university" value="tokyo">東京大学</label></li> 27<li><label><input type="checkbox" name="university" value="kyoto">京都大学</label></li> 28<li><label><input type="checkbox" name="university" value="keio">慶應大学</label></li> 29<li><label><input type="checkbox" name="university" value="waseda">早稲田大学</label></li> 30</ul> 31<hr> 32<ul> 33<li><label><input type="checkbox" name="major" value="science">理学部</label></li> 34<li><label><input type="checkbox" name="major" value="engineering">工学部</label></li> 35<li><label><input type="checkbox" name="major" value="letters">文学部</label></li> 36<li><label><input type="checkbox" name="major" value="law">法学部</label></li> 37</ul> 38<hr> 39<ul> 40<li><label><input type="checkbox" name="graduate" value="goSame">院進(同大学)</label></li> 41<li><label><input type="checkbox" name="graduate" value="goDiffe">院進(他大学)</label></li> 42<li><label><input type="checkbox" name="graduate" value="work">就職</label></li> 43<li><label><input type="checkbox" name="graduate" value="establish">起業</label></li> 44<hr> 45<ul class="list"> 46 <li class="list_item" 47 data-university='["tokyo","kyoto"]' 48 data-major='["science","engineering"]' 49 data-graduate='["goSame","goDiffe"]' 50 >国公立理系院進学費: xx万円 51 </li> 52 <li class="list_item" 53 data-university='["tokyo","kyoto"]' 54 data-major='["science","engineering"]' 55 data-graduate='["work","establish"]' 56 >国公立理系就職学費: xx万円 57 </li> 58 <li class="list_item" 59 data-university='["tokyo","kyoto"]' 60 data-major='["letters","law"]' 61 data-graduate='["goSame","goDiffe"]' 62 >国公立文系院進学費: xx万円 63 </li> 64 <li class="list_item" 65 data-university='["tokyo","kyoto"]' 66 data-major='["letters","law"]' 67 data-graduate='["work","establish"]' 68 >国公立文系就職学費: xx万円 69 </li> 70 <li class="list_item" 71 data-university='["keio","waseda"]' 72 data-major='["science","engineering"]' 73 data-graduate='["goSame","goDiffe"]' 74 >私立理系院進学費: xx万円 75 </li> 76 <li class="list_item" 77 data-university='["keio","waseda"]' 78 data-major='["science","engineering"]' 79 data-graduate='["work","establish"]' 80 >私立理系就職学費: xx万円 81 </li> 82 <li class="list_item" 83 data-university='["keio","waseda"]' 84 data-major='["letters","law"]' 85 data-graduate='["goSame","goDiffe"]' 86 >私立文系院進学費: xx万円 87 </li> 88 <li class="list_item" 89 data-university='["keio","waseda"]' 90 data-major='["letters","law"]' 91 data-graduate='["work","establish"]' 92 >私立文系就職学費: xx万円 93 </li> 94</ul>

投稿2022/03/07 01:07

編集2022/03/11 10:24
yambejp

総合スコア114829

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

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

maniandmani

2022/03/07 01:59

ご丁寧にありがとうございます。 プログラミングについてまだ未熟ですので、初歩的な質問を多くしてしまうかもしれません。 ①「生のJS」という表現がありましたが、生ではないものとの違いは何でしょうか。 ② javascriptの中にhtmlのような記述がありますが、このコードをhtmlに貼れば良いのかあ、javascriptに貼れば良いのか ③ 教えていただいたコードは、それ単体で機能するものでしょうか、それとも私の書いていたjavascriptと組み合わせて機能するものでしょうか。もし、組み合わせて機能するものでしたら、どこの部分を削除して、その代わりにペーストすれば良いか教えて頂きたいです。
yambejp

2022/03/07 02:19 編集

jQueryはライブラリです。 ご質問の中に「$(function() {」的な表現があったためjQueryを使用している前提で 前半の回答はしてあります。 jQueryを使用しなくても動作させることは可能なのでその記述が後半部分です なお今回の回答はフィルタ部分しか記載していませんので その他の動作との挙動の調整はご自身で調整いただくことになります それとuniversityとmajorの相関関係をはっきりしたほうがいいでしょう universityとmajorがor関係にある場合は単純ですが and関係にある場合たとえばmajorを選択しないでuniversityだけ選択した場合は すべてのmajorが対象にするかなど判断が付きません
maniandmani

2022/03/07 05:06

①について理解しました!インタネットにあった似たようなシステムのJSを借用しただけでしたので、JQueryが何かなども全く知りませんでした... JSについてあまりわかっていないのが正直なところですので、もしお時間ありましたら、私のJSの記述のどこの部分を削除して、教えていただいたコードを加えれば良いかについても教えていただけたらありがたいです!!! 説明不足で申し訳ございません。 universityとmajorはand関係です。 そして、majorを選択しないでuniversityだけを選択した場合、全てのmajorが対象で表示されます。 (実は質問用に大学の学費リストのシステムに変更しましたが、実際は違うシステムで、8項目、500リストを準備しているので、ボタンを押していくとどんどんリストが絞り込まれる仕組みにしたいです)
yambejp

2022/03/07 05:33 編集

> 私のJSの記述のどこの部分を削除して、教えていただいたコードを加えれば良いか ソースを理解していないなら全部入れ替えたほうが早いと思います。 私のサンプルをコピペして動作確認できませんか?
maniandmani

2022/03/07 10:16

yambejpさんのサンプルはきちんと機能しました!ありがとうございます。 ただ、data-universityとdata-majorのどちらもで同じような絞り込みをしたい場合、どのようにJQueryを記述すれば良いのかわかりません.... 試しにuniversityのJQueryの記述を複製し、universityの部分をmajorに変えてみましたが、うまくいきません... また、今回yambejpさんは、例としてdata-属性をuniveristyのみにし、checkboxのlabel for-属性も省略されているので、cssにも紐付けられないようになっています。 htmlとCSSは私が記述したものを使用したいのですが、いただいたJQueryのサンプルを私のできる限りでいじってみましたが、なかなかうまくいきません。 何度もお手数をおかけしますが、このhtmlとCSSに対応したJQueryの記述を教えていただけると幸いです!
yambejp

2022/03/07 11:03

universityとmajorの条件が2つの場合を追記しました
maniandmani

2022/03/08 06:22

ご丁寧にありがとうございます。 二つのdata-属性に対してはできました! こんなに少ないJQueryの記述できちんと動くなんてすごいですね! ただ、いただいたコードを応用させて3つのdata-属性に対して同じようなことをしようとすると、うまくいきません... (変更後のhtmlとJQueryを追記しましたので、ご確認ください) 申し訳ございませんが、3つの場合どのように記述すれば良いのか教えていただけると幸いです。何から何まで質問する形となってしまい申し訳ございません...
yambejp

2022/03/08 07:03

3つめってなんでしたっけ?
maniandmani

2022/03/09 03:05

最初にお見せしたコードには入っていなかったのですが、今回「院進」or「就職」を選ぶ項目を追加しました。 この学費検索のシステムは質問用に作ったものですので、元のコードでは、data-属性が7つあります。
yambejp

2022/03/09 03:08

HTMLの参考データがあれば考えてみます。 3つ以上になると7つでもロジックはさほど変わらないと思います
maniandmani

2022/03/09 12:54

ありがとうございます!
maniandmani

2022/03/11 09:27

3つ目の項目を訂正し、「院進(同大学)」「院進(他大学)」のどちらを選択しても院進が、「就職」「起業」のどちらを選択しても「就職」に紐づけられたリストが表示されるようにして頂きたいです! お時間ある時によろしくお願いいたします。
yambejp

2022/03/11 10:26 編集

まとめてみました。 チェックボックスのname,valueの組み合わせとliのカスタムデータが一致する必要があります テストデータが少ないので検証が完全にはできてないですがなんとなく動いているようにみえます
maniandmani

2022/03/12 00:33

元の7項目あるプログラミングの方でもできました! 本当にありがとうございました! あんなにシンプルなJSの記述で動くなんてすごいですね。 これを機にプログラミングに興味が持てました!
guest

0

がんばれーーーー僕も悩んだことある、やめてけど

投稿2022/03/06 01:16

reminuku

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問