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

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/07 01:59
2022/03/07 02:19 編集
2022/03/07 05:06
2022/03/07 05:33 編集
2022/03/07 10:16
2022/03/07 11:03
2022/03/08 06:22
2022/03/08 07:03
2022/03/09 03:05
2022/03/09 03:08
2022/03/09 12:54
2022/03/11 09:27
2022/03/11 10:26 編集
2022/03/12 00:33