質問編集履歴

1

質問内容とソースコードを再編集

2023/01/23 05:33

投稿

abaddon
abaddon

スコア0

test CHANGED
@@ -1 +1 @@
1
- JavaScriptで絞り込み検索(valueを複数設定したい)
1
+ JavaScriptで絞り込み検索(data属性を複数設定したい)
test CHANGED
@@ -1,3 +1,7 @@
1
+ ※前回の質問が不適切だったため質問の内容を書き直しました。
2
+ 前回の質問と内容が少し異なるのですが再度知恵をお貸いただけると有難いです。
3
+ (編集前の回答やコメントをくださった方有難うございました。質問の仕方が悪く申し訳ございません)
4
+
1
5
  ### 前提
2
6
 
3
7
  お世話になります。
@@ -5,101 +9,125 @@
5
9
 
6
10
  ### 実現したいこと
7
11
 
8
- value1つのきは上手く絞り込みができているのですが、valueを複数設定できるようにしたいです。
12
+ 「selectでtype01とtype02選択した場合にアイテム04を表示させた
9
13
 
10
- 例えば
11
- ```
12
- <option value="red yellow">暖色系</option>
14
+ アイテム04にはtype01とtype02の2つのdata-typeを設定したいのですが、現在のJavaScriptのコードを流用して可能なのでしょうか。
13
- <option value="blue green">寒色系</option>
15
+ (アイテム04のdivに「data-type="type01 type02"」と書いても絞り込み結果には表示されませんでした。)
14
- ```
15
- という風に、暖色系を選択したときはvalueに入力された2つの要素を両方を表示したいです。
16
- 試しに入力しましたが絞り込みの結果が表示されなくなってしましました。
17
-
18
- 恐らくJavaScriptのコードのほうを変更しないとうまくいかないと思うのですがどのように変更すれば可能になるのかわからず困っています。
19
- 該当のソースコードを記載しますのでわかる方いらっしゃいましたら知恵を貸していただけたら嬉しいです。
20
16
 
21
17
 
22
18
  ### 該当のソースコード
23
19
 
20
+ ```html
21
+ <div class="contents">
22
+
23
+ <div class="filter-area">
24
+ <div class="wrap">
25
+ <div class="box">
26
+ <p>選択項目</p>
27
+ <div class="select">
28
+ <select class="form-select js-filter" name="type">
29
+ <option value="all">全て</option>
30
+ <option value="type01">タイプ01</option>
31
+ <option value="type02">タイプ02</option>
32
+ <option value="type03">タイプ03</option>
33
+ </select>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ <!-- /filter-area -->
39
+
40
+ <div class="item-area">
41
+ <div class="wrap">
42
+ <!------ 結果メッセージ ------>
43
+ <p>検索結果:<span class="js-filter-msg"></span></p>
44
+ <!------ アイテム一覧 ------>
45
+ <div class="js-filter-items">
46
+
47
+ <div class="js-filter-item" data-type="type01">
48
+ アイテム01
49
+ </div>
50
+ <div class="js-filter-item" data-type="type02">
51
+ アイテム02
52
+ </div>
53
+ <div class="js-filter-item" data-type="type03">
54
+ アイテム03
55
+ </div>
56
+ <div class="js-filter-item" data-type="type01 type02">
57
+ アイテム04
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ <!-- /item-area -->
63
+
64
+ </div>
65
+ <!-- /contents -->
66
+ ```
67
+
68
+ ```css
69
+ .d-none {
70
+ visibility: hidden;
71
+ display: none;
72
+ }
73
+ ```
74
+
24
75
  ```JavaScript
25
- function multi_filter(h, t, s, r = '') {
76
+ function multi_filter(h, t, s, r = "") {
26
- //****** 変数定義 ******
27
77
  let hidden = h;
28
- let target = t;
29
- let targets = document.querySelectorAll(target);
78
+ let targets = document.querySelectorAll(t);
30
79
  let selects = document.querySelectorAll(s);
31
80
  let result = document.querySelector(r);
32
- let result_msg = '';
81
+ let result_msg = "";
82
+
33
83
 
34
84
  if (selects) {
85
+ //****** for all select ******
86
+ for (let i of selects) {
87
+ i.addEventListener("change", () => {
88
+ let hidden_num = 0;
35
89
 
90
+ //*** for each target ***
91
+ for (let ii of targets) {
92
+ //*** delete hidden class ***
36
- let selects_length = selects.length;
93
+ ii.classList.remove(hidden);
37
- //****** セレクトボックスごとにchangeイベントをチェック ******
94
+ //*** check target every select ***
38
- for (let i = 0; i < selects_length; i++) {
95
+ for (let iii of selects) {
39
- selects[i].addEventListener('change', () => {
96
+ //*** get select name value / option value / target data attribute ***
97
+ let value = iii.value;
40
- let targets_length = targets.length;
98
+ let name = iii.getAttribute("name");
99
+ let item_data = ii.getAttribute("data-" + name);
100
+ //*** set hidden class ***
101
+ // exist value & except all & item_data not match & no hidden class
102
+ if (value && value !== "all" && value !== item_data && !ii.classList.contains(hidden)) {
103
+ ii.classList.add(hidden);
41
- let hidden_num = 0;
104
+ hidden_num++;
105
+ }
106
+ }
107
+ }
42
108
 
109
+ //****** result message ******
110
+ if (result) {
111
+ //*** not found ***
43
- window.setTimeout(() => {
112
+ if (hidden_num === targets.length) {
113
+ result_msg = "No such thing..";
114
+ }
115
+ //*** found ***
116
+ else {
117
+ let result_num = targets.length - hidden_num;
118
+ result_msg = result_num + " results";
119
+ }
120
+ result.innerText = result_msg;
121
+ }
44
122
 
45
- //*** targetを順番に調べる ***
46
- for (let ii = 0; ii < targets_length; ii++) {
47
- //*** 非表示クラスを一旦削除 ***
48
- targets[ii].classList.remove(hidden);
49
- //*** セレクトボックスの数だけ総当たりで検索 ***
50
- for (let iii = 0; iii < selects_length; iii++) {
51
- //*** selectのname値 / optionのvalue値 / targetの文字列を取得 ***
52
- let value = selects[iii].value;
53
- let name = selects[iii].getAttribute('name');
54
- let item_data = targets[ii].getAttribute('data-' + name);
55
- //*** value値が存在&all以外&一致しない / 非表示クラスなしのとき:非表示クラスを付与 ***
56
- if (value && value !== 'all' && value !== item_data && !targets[ii].classList.contains(hidden)) {
57
- targets[ii].classList.add(hidden);
58
- hidden_num++;
123
+ });
59
- }
124
+ }
60
- }
61
- }
62
-
63
- },);
64
-
65
- //****** 結果メッセージ ******
66
- if (result) {
67
- //*** 該当なし ***
68
- if (hidden_num === targets_length) {
69
- result_msg = '見つかりませんでした。';
70
- }
71
- //*** 該当あり ***
72
- else {
73
- let result_num = targets_length - hidden_num;
74
- result_msg = result_num + '件見つかりました。';
75
- }
76
- result.innerText = result_msg;
77
- }
78
- });
79
- }
80
125
  }
81
126
  }
82
127
 
83
- //*** 関数呼び出し ***
128
+ //*** call ***
84
- multi_filter('d-none', '.js-filter-item', '.js-filter', '.js-filter-msg');
129
+ multi_filter("d-none", ".js-filter-item", ".js-filter", ".js-filter-msg");
85
130
  ```
86
131
 
87
- ```html
88
- <div class="filter-area">
89
- <div class="box">
90
- 絞り込み検索
91
- </div>
92
- <div class="box">
93
- <p>項目</p>
94
- <div class="select">
95
- <select class="form-select js-filter" name="type01">
96
- <option value="all">すべての色</option>
97
- <option value="red yellow">暖色系</option>
98
- <option value="blue green">寒色系</option>
99
- <option value="etc">その他</option>
100
- </select>
101
- </div>
102
- </div>
103
- </div>
104
- ```
105
132
 
133
+