回答編集履歴

3

chousei

2022/03/11 10:24

投稿

yambejp
yambejp

スコア114784

test CHANGED
@@ -60,20 +60,21 @@
60
60
  <li class="list_item" data-university='["tokyo","kyoto","osaka"]'>東京,京都,大阪</li>
61
61
  </ul>
62
62
  ```
63
+ # 3つ以上
63
- 条件が2つある場合
64
+ 条件が2つある場合は省略)
65
+ datasetの要素をリストで宣言してしまえばいくつでもいけそうです
64
66
  ```javascript
65
67
  <script>
66
68
  document.addEventListener('change',e=>{
67
69
  const t=e.target;
70
+ const list=["university","major","graduate"];
68
- if(t.closest('[name=university],[name=major]')){
71
+ if(t.closest(list.map(x=>`[name=${x}]`).join(','))){
69
- const univ=[...document.querySelectorAll('[name=university]:checked')].map(x=>x.value);
72
+ const selected={};
70
- const majo=[...document.querySelectorAll('[name=major]:checked')].map(x=>x.value);
73
+ list.forEach(x=>selected[x]=[...document.querySelectorAll(`[name=${x}]:checked`)].map(x=>x.value));
71
74
  document.querySelectorAll('.list_item').forEach(x=>{
72
75
  let flg=false;
73
- if(univ.length>0 || majo.length>0){
76
+ if(Object.values(selected).flat().length>0){
74
- flg=true &&
75
- (univ.length==0 || JSON.parse(x.dataset.university).filter(y=>univ.indexOf(y)>=0).length) &&
77
+ 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);
76
- (majo.length==0 || JSON.parse(x.dataset.major).filter(y=>majo.indexOf(y)>=0).length)
77
78
  }
78
79
  x.toggleAttribute('hidden',!flg);
79
80
  });
@@ -101,9 +102,60 @@
101
102
  <li><label><input type="checkbox" name="major" value="law">法学部</label></li>
102
103
  </ul>
103
104
  <hr>
104
- <ul class="list"><li class="list_item" data-university='["tokyo","kyoto"]' data-major='["science","engineering"]'>国公立理系学費: xx万円</li>
105
+ <ul>
105
- <li class="list_item" data-university='["tokyo","kyoto"]' data-major='["letters","law"]'>国公立文系費: xx万円</li>
106
+ <li><label><input type="checkbox" name="graduate" value="goSame">院進(同大)</label></li>
106
- <li class="list_item" data-university='["keio","waseda"]' data-major='["science","engineering"]'>私立理系費: xx万円</li>
107
+ <li><label><input type="checkbox" name="graduate" value="goDiffe">院進(他大)</label></li>
108
+ <li><label><input type="checkbox" name="graduate" value="work">就職</label></li>
107
- <li class="list_item" data-university='["keio","waseda"]' data-major='["letters","law"]'>私立文系学費: xx万円</li>
109
+ <li><label><input type="checkbox" name="graduate" value="establish">起業</label></li>
110
+ <hr>
111
+ <ul class="list">
112
+ <li class="list_item"
113
+ data-university='["tokyo","kyoto"]'
114
+ data-major='["science","engineering"]'
115
+ data-graduate='["goSame","goDiffe"]'
116
+ >国公立理系院進学費: xx万円
117
+ </li>
118
+ <li class="list_item"
119
+ data-university='["tokyo","kyoto"]'
120
+ data-major='["science","engineering"]'
121
+ data-graduate='["work","establish"]'
122
+ >国公立理系就職学費: xx万円
123
+ </li>
124
+ <li class="list_item"
125
+ data-university='["tokyo","kyoto"]'
126
+ data-major='["letters","law"]'
127
+ data-graduate='["goSame","goDiffe"]'
128
+ >国公立文系院進学費: xx万円
129
+ </li>
130
+ <li class="list_item"
131
+ data-university='["tokyo","kyoto"]'
132
+ data-major='["letters","law"]'
133
+ data-graduate='["work","establish"]'
134
+ >国公立文系就職学費: xx万円
135
+ </li>
136
+ <li class="list_item"
137
+ data-university='["keio","waseda"]'
138
+ data-major='["science","engineering"]'
139
+ data-graduate='["goSame","goDiffe"]'
140
+ >私立理系院進学費: xx万円
141
+ </li>
142
+ <li class="list_item"
143
+ data-university='["keio","waseda"]'
144
+ data-major='["science","engineering"]'
145
+ data-graduate='["work","establish"]'
146
+ >私立理系就職学費: xx万円
147
+ </li>
148
+ <li class="list_item"
149
+ data-university='["keio","waseda"]'
150
+ data-major='["letters","law"]'
151
+ data-graduate='["goSame","goDiffe"]'
152
+ >私立文系院進学費: xx万円
153
+ </li>
154
+ <li class="list_item"
155
+ data-university='["keio","waseda"]'
156
+ data-major='["letters","law"]'
157
+ data-graduate='["work","establish"]'
158
+ >私立文系就職学費: xx万円
159
+ </li>
108
160
  </ul>
109
- ```
161
+ ```

2

調整

2022/03/07 11:02

投稿

yambejp
yambejp

スコア114784

test CHANGED
@@ -60,3 +60,50 @@
60
60
  <li class="list_item" data-university='["tokyo","kyoto","osaka"]'>東京,京都,大阪</li>
61
61
  </ul>
62
62
  ```
63
+ 条件が2つある場合
64
+ ```javascript
65
+ <script>
66
+ document.addEventListener('change',e=>{
67
+ const t=e.target;
68
+ if(t.closest('[name=university],[name=major]')){
69
+ const univ=[...document.querySelectorAll('[name=university]:checked')].map(x=>x.value);
70
+ const majo=[...document.querySelectorAll('[name=major]:checked')].map(x=>x.value);
71
+ document.querySelectorAll('.list_item').forEach(x=>{
72
+ let flg=false;
73
+ if(univ.length>0 || majo.length>0){
74
+ flg=true &&
75
+ (univ.length==0 || JSON.parse(x.dataset.university).filter(y=>univ.indexOf(y)>=0).length) &&
76
+ (majo.length==0 || JSON.parse(x.dataset.major).filter(y=>majo.indexOf(y)>=0).length)
77
+ }
78
+ x.toggleAttribute('hidden',!flg);
79
+ });
80
+ }
81
+ });
82
+ window.addEventListener('DOMContentLoaded', ()=>{
83
+ const e = new CustomEvent("HTMLEvents");
84
+ e.initEvent('change', true, true );
85
+ document.querySelector('[name=university]').dispatchEvent(e);
86
+ });
87
+ </script>
88
+ <form>
89
+ <ul>
90
+ <li>
91
+ <label><input type="checkbox" name="university" value="tokyo">東京大学</label></li>
92
+ <li><label><input type="checkbox" name="university" value="kyoto">京都大学</label></li>
93
+ <li><label><input type="checkbox" name="university" value="keio">慶應大学</label></li>
94
+ <li><label><input type="checkbox" name="university" value="waseda">早稲田大学</label></li>
95
+ </ul>
96
+ <hr>
97
+ <ul>
98
+ <li><label><input type="checkbox" name="major" value="science">理学部</label></li>
99
+ <li><label><input type="checkbox" name="major" value="engineering">工学部</label></li>
100
+ <li><label><input type="checkbox" name="major" value="letters">文学部</label></li>
101
+ <li><label><input type="checkbox" name="major" value="law">法学部</label></li>
102
+ </ul>
103
+ <hr>
104
+ <ul class="list"><li class="list_item" data-university='["tokyo","kyoto"]' data-major='["science","engineering"]'>国公立理系学費: xx万円</li>
105
+ <li class="list_item" data-university='["tokyo","kyoto"]' data-major='["letters","law"]'>国公立文系学費: xx万円</li>
106
+ <li class="list_item" data-university='["keio","waseda"]' data-major='["science","engineering"]'>私立理系学費: xx万円</li>
107
+ <li class="list_item" data-university='["keio","waseda"]' data-major='["letters","law"]'>私立文系学費: xx万円</li>
108
+ </ul>
109
+ ```

1

追記

2022/03/07 01:48

投稿

yambejp
yambejp

スコア114784

test CHANGED
@@ -27,5 +27,36 @@
27
27
  <li class="list_item" data-university='["tokyo","osaka"]'>東京,大阪</li>
28
28
  <li class="list_item" data-university='["tokyo","kyoto","osaka"]'>東京,京都,大阪</li>
29
29
  </ul>
30
-
31
30
  ```
31
+ 生のjsならこう?
32
+ ```javascript
33
+ <script>
34
+ document.addEventListener('change',e=>{
35
+ const t=e.target;
36
+ if(t.closest('.university')){
37
+ const vals=[...document.querySelectorAll('.university:checked')].map(x=>x.value);
38
+ document.querySelectorAll('.list_item').forEach(x=>{
39
+ const flg=JSON.parse(x.dataset.university).filter(y=>vals.indexOf(y)>=0).length;
40
+ x.toggleAttribute('hidden',!flg);
41
+ });
42
+ }
43
+ });
44
+ window.addEventListener('DOMContentLoaded', ()=>{
45
+ const e = new CustomEvent("HTMLEvents");
46
+ e.initEvent('change', true, true );
47
+ document.querySelector('.university').dispatchEvent(e);
48
+ });
49
+ </script>
50
+ <label><input type="checkbox" class="university" value="tokyo">東京</lavel>
51
+ <label><input type="checkbox" class="university" value="kyoto">京都</lavel>
52
+ <label><input type="checkbox" class="university" value="osaka">大阪</lavel>
53
+ <ul>
54
+ <li class="list_item" data-university='["tokyo"]'>東京</li>
55
+ <li class="list_item" data-university='["kyoto"]'>京都</li>
56
+ <li class="list_item" data-university='["osaka"]'>大阪</li>
57
+ <li class="list_item" data-university='["tokyo","kyoto"]'>東京,京都</li>
58
+ <li class="list_item" data-university='["kyoto","osaka"]'>京都,大阪</li>
59
+ <li class="list_item" data-university='["tokyo","osaka"]'>東京,大阪</li>
60
+ <li class="list_item" data-university='["tokyo","kyoto","osaka"]'>東京,京都,大阪</li>
61
+ </ul>
62
+ ```