回答編集履歴
19
テキスト修正
test
CHANGED
@@ -212,7 +212,7 @@
|
|
212
212
|
|
213
213
|
|
214
214
|
|
215
|
-
です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、
|
215
|
+
です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、 lodash の [isEqual](https://lodash.com/docs/4.17.10#isEqual) を使用しています。
|
216
216
|
|
217
217
|
|
218
218
|
|
18
テキスト修正
test
CHANGED
@@ -275,3 +275,27 @@
|
|
275
275
|
|
276
276
|
|
277
277
|
上記の回答の中にも、`change`イベントが発生して選択された値を保存しておく場所として、 `data-`属性を使うというものが、いくつか見つかります。
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
---
|
282
|
+
|
283
|
+
**追記6**
|
284
|
+
|
285
|
+
|
286
|
+
|
287
|
+
追記4 に書いたコードの以下の部分
|
288
|
+
|
289
|
+
```javascript
|
290
|
+
|
291
|
+
$(this).val($(this).val().filter(v => v!=""));
|
292
|
+
|
293
|
+
```
|
294
|
+
|
295
|
+
は、以下のように書くことで少し短くすることができます。
|
296
|
+
|
297
|
+
```javascript
|
298
|
+
|
299
|
+
$(this).val($(this).val().filter(v => v));
|
300
|
+
|
301
|
+
```
|
17
テキスト修正
test
CHANGED
@@ -204,7 +204,7 @@
|
|
204
204
|
|
205
205
|
|
206
206
|
|
207
|
-
判断
|
207
|
+
上記の比較によって判断するべき条件は、
|
208
208
|
|
209
209
|
|
210
210
|
|
@@ -212,7 +212,7 @@
|
|
212
212
|
|
213
213
|
|
214
214
|
|
215
|
-
です。以下は上記の
|
215
|
+
です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、初めのご質問でも使った、 lodash の [isEqual](https://lodash.com/docs/4.17.10#isEqual) を使用しています。
|
216
216
|
|
217
217
|
|
218
218
|
|
16
テキスト修正
test
CHANGED
@@ -266,7 +266,7 @@
|
|
266
266
|
|
267
267
|
|
268
268
|
|
269
|
-
「changeイベントが発生する前の value を取得するにはどうしたらいいか?」というお題は、以下にも投稿されています。
|
269
|
+
「onChangeハンドラの中で、対象のchangeイベントが発生する前の value を取得するにはどうしたらいいか?」というお題は、以下にも投稿されています。
|
270
270
|
|
271
271
|
|
272
272
|
|
15
テキスト修正
test
CHANGED
@@ -257,3 +257,21 @@
|
|
257
257
|
|
258
258
|
|
259
259
|
に作成しました。
|
260
|
+
|
261
|
+
|
262
|
+
|
263
|
+
---
|
264
|
+
|
265
|
+
**追記5**
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
「changeイベントが発生する前の value を取得するにはどうしたらいいか?」というお題は、以下にも投稿されています。
|
270
|
+
|
271
|
+
|
272
|
+
|
273
|
+
stackoverflow: [Getting value of select (dropdown) before change](https://stackoverflow.com/questions/4076770/getting-value-of-select-dropdown-before-change)
|
274
|
+
|
275
|
+
|
276
|
+
|
277
|
+
上記の回答の中にも、`change`イベントが発生して選択された値を保存しておく場所として、 `data-`属性を使うというものが、いくつか見つかります。
|
14
テキスト修正
test
CHANGED
@@ -177,3 +177,83 @@
|
|
177
177
|
|
178
178
|
|
179
179
|
[https://jsfiddle.net/jun68ykt/qw64naub/81/](https://jsfiddle.net/jun68ykt/qw64naub/81/)
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
---
|
184
|
+
|
185
|
+
**追記4**
|
186
|
+
|
187
|
+
|
188
|
+
|
189
|
+
コメントのほうから、
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
> 何度もすみません、もし可能でしたら
|
194
|
+
|
195
|
+
> ・・・
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
ということで頂戴した、追加要件を実現する方法です。
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
ご希望の挙動を満たすには、`change`イベントが発生したときに選択状態にした`<option>`の value配列を保存しておいて、次に新たな`change`イベントが発生したときに選択されている`<option>`の value配列と、保存しておいた前回の`change`イベント発生時に選択状態にした値の配列とを比較して、次の望ましい状態を作ってから、再度、保存しておく処理が必要になると思います。どこに保存しておくかですが、 `data-`属性に保存するというのが一案です。
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
判断して処理を変えなければならないのは、
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
- 前回の`change`イベント発生時に、最終的に選択状態にした値の配列が、`[""]`であるか否か
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
です。以下は上記の考えを実装したコードです。
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
```javascript
|
220
|
+
|
221
|
+
// optionの選択状態が変更されたときの設定
|
222
|
+
|
223
|
+
$('select')
|
224
|
+
|
225
|
+
.data('prev-values', [""])
|
226
|
+
|
227
|
+
.on('change', function() {
|
228
|
+
|
229
|
+
if ($(this).val().includes("")) {
|
230
|
+
|
231
|
+
if (_.isEqual($(this).data('prev-values'), [""])) {
|
232
|
+
|
233
|
+
$(this).val($(this).val().filter(v => v!=""));
|
234
|
+
|
235
|
+
} else {
|
236
|
+
|
237
|
+
$(this).val([""]);
|
238
|
+
|
239
|
+
}
|
240
|
+
|
241
|
+
}
|
242
|
+
|
243
|
+
$(this).data('prev-values', [...$(this).val()]);
|
244
|
+
|
245
|
+
});
|
246
|
+
|
247
|
+
```
|
248
|
+
|
249
|
+
|
250
|
+
|
251
|
+
上記のサンプルを
|
252
|
+
|
253
|
+
|
254
|
+
|
255
|
+
[https://jsfiddle.net/jun68ykt/qw64naub/95/](https://jsfiddle.net/jun68ykt/qw64naub/95/)
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
に作成しました。
|
13
テキスト追加
test
CHANGED
@@ -166,7 +166,9 @@
|
|
166
166
|
|
167
167
|
上記を追加すると、以下のような効果があります。
|
168
168
|
|
169
|
-
|
169
|
+
|
170
|
+
|
171
|
+
例えば、`赤` と`緑`が選ばれている状態で、さらに `選択しない`を選択状態にすることを想定します。すると上記で設定した`change`ハンドラ `function() { … }` が呼ばれて、関数の中で`$(this).val()`とすると、選択された `option` の valueの配列が取れるので、今想定している状況では、`["", "red", "grren"]` と、3つの要素を持ちますが、これらの要素のうち、空文字列 `""` が含まれているということは(= `.includes("")` が true ならば)、「指定しない」が選ばれたことを示しています。その場合は、「指定しない」だけが選ばれていることを表す配列 `[""]` を、`$(this).val(設定値)` に与えると、「指定しない」ではない他の選択肢は選ばれていない状態にすることができます。
|
170
172
|
|
171
173
|
|
172
174
|
|
12
テキスト追加
test
CHANGED
@@ -174,4 +174,4 @@
|
|
174
174
|
|
175
175
|
|
176
176
|
|
177
|
-
[https://jsfiddle.net/jun68ykt/qw64naub/
|
177
|
+
[https://jsfiddle.net/jun68ykt/qw64naub/81/](https://jsfiddle.net/jun68ykt/qw64naub/81/)
|
11
テキスト追加
test
CHANGED
@@ -123,3 +123,55 @@
|
|
123
123
|
|
124
124
|
|
125
125
|
複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を回答に加筆しました。
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
---
|
130
|
+
|
131
|
+
**追記3**
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
コメントのほうで頂いた、
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
> “指定しない”と他の選択肢を連動させることは可能でしょうか?
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
との件ですが、`<select>` の中にある、どの`<option>`が選ばれているかが変化したときの `chage`イベントハンドラに、ご要望の処理を設定することで可能です。
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
具体的には例えば以下を追加します。
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
```javascript
|
152
|
+
|
153
|
+
// ”指定しない" が選択されたら、他の選択肢は選ばれていない状態にする
|
154
|
+
|
155
|
+
$('select').on('change', function() {
|
156
|
+
|
157
|
+
if ($(this).val().includes(""))
|
158
|
+
|
159
|
+
$(this).val([""]);
|
160
|
+
|
161
|
+
});
|
162
|
+
|
163
|
+
```
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
上記を追加すると、以下のような効果があります。
|
168
|
+
|
169
|
+
例えば、`赤` と`緑`が選ばれている状態で、さらに `選択しない`を選択状態にするとします。すると上記で設定した`change`ハンドラ `function() { … }` が呼ばれて、関数の中で`$(this).val()`とすると、選択された `option` の valueの配列が取れます。今の場合は、`["", "red", "grren"]` と、3つの要素を持ちますが、これらの要素のうち、空文字列 `""` が含まれていれば(= `.includes("")` が true ならば)、「指定しない」が選ばれたことを示しています。その場合は、「指定しない」だけが選ばれていることを表す配列 `[""]` を、`$(this).val(設定値)` に与えると、「指定しない」ではない他の選択肢は選ばれていない状態にすることができます。
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
※以下にサンプルを作成しました。
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
[https://jsfiddle.net/jun68ykt/qw64naub/79/](https://jsfiddle.net/jun68ykt/qw64naub/79/)
|
10
テキスト修正
test
CHANGED
@@ -122,4 +122,4 @@
|
|
122
122
|
|
123
123
|
|
124
124
|
|
125
|
-
複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を加筆
|
125
|
+
複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を回答に加筆しました。
|
9
テキスト修正
test
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
に記載
|
13
|
+
に記載されているように、 v4 から削除されており、替わりに [filter](https://lodash.com/docs/4.17.10#filter) を使うことになっていますので、以下の回答もこれに従っています。
|
14
14
|
|
15
15
|
|
16
16
|
|
8
テキスト修正
test
CHANGED
@@ -48,9 +48,9 @@
|
|
48
48
|
|
49
49
|
return (
|
50
50
|
|
51
|
-
(query.color.includes("") || query.color.includes(item.color)) &&
|
51
|
+
(query.colors.includes("") || query.colors.includes(item.color)) &&
|
52
52
|
|
53
|
-
(query.type.includes("") || query.type.includes(item.type))
|
53
|
+
(query.types.includes("") || query.types.includes(item.type))
|
54
54
|
|
55
55
|
);
|
56
56
|
|
@@ -60,7 +60,15 @@
|
|
60
60
|
|
61
61
|
|
62
62
|
|
63
|
-
`select`が複数選択可能な場合、`
|
63
|
+
- `select`が複数選択可能な場合、`.val()` は選択された `<option>`の value を要素とする配列になります。
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
- したがって、`<select>`の id と、 `query` のプロパティ名である`color`と`type`は、`color`**s** および、`type`**s** と複数形にしたほうがよいです。
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
- `query.colors` と `query.types` に対して、[includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) を使って、全item の中で条件を満たすものについて `true` を返すような関数を、`filter` の第2引数に渡します。
|
64
72
|
|
65
73
|
|
66
74
|
|
@@ -72,7 +80,7 @@
|
|
72
80
|
|
73
81
|
|
74
82
|
|
75
|
-
- 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/6
|
83
|
+
- 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/68/](https://jsfiddle.net/jun68ykt/qw64naub/68/)
|
76
84
|
|
77
85
|
|
78
86
|
|
@@ -96,12 +104,22 @@
|
|
96
104
|
|
97
105
|
return (
|
98
106
|
|
99
|
-
(query.color.includes("") || query.color.includes(item.color)) &&
|
107
|
+
(query.colors.includes("") || query.colors.includes(item.color)) &&
|
100
108
|
|
101
|
-
(query.type.includes("") || query.type.includes(item.type))
|
109
|
+
(query.types.includes("") || query.types.includes(item.type))
|
102
110
|
|
103
111
|
);
|
104
112
|
|
105
113
|
});
|
106
114
|
|
107
115
|
```
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
---
|
120
|
+
|
121
|
+
**追記2**
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を加筆するため、回答を修正しました。
|
7
テキスト修正
test
CHANGED
@@ -60,19 +60,19 @@
|
|
60
60
|
|
61
61
|
|
62
62
|
|
63
|
-
`select`が複数選択可能な場合、`query.color` と `query.type` はともに配列になり
|
63
|
+
`select`が複数選択可能な場合、`query.color` と `query.type` はともに、選択された `<option>` の `value`属性を要素とする配列になります。これに対して、[includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) を使って、全item の中で条件を満たすものについて `true` を返すような関数を、`filter` の第2引数に渡します。
|
64
64
|
|
65
65
|
|
66
66
|
|
67
|
-
|
67
|
+
以下に上記のサンプルを作成しました。(使用している lodash のバージョンは、4.17.10です)
|
68
68
|
|
69
69
|
|
70
70
|
|
71
|
-
単一選択: [https://jsfiddle.net/jun68ykt/qw64naub/28/](https://jsfiddle.net/jun68ykt/qw64naub/28/)
|
71
|
+
- 単一選択: [https://jsfiddle.net/jun68ykt/qw64naub/28/](https://jsfiddle.net/jun68ykt/qw64naub/28/)
|
72
72
|
|
73
|
+
|
73
74
|
|
74
|
-
|
75
|
-
複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/60/](https://jsfiddle.net/jun68ykt/qw64naub/60/)
|
75
|
+
- 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/60/](https://jsfiddle.net/jun68ykt/qw64naub/60/)
|
76
76
|
|
77
77
|
|
78
78
|
|
6
テキスト修正
test
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
|
37
37
|
```
|
38
38
|
|
39
|
-
|
39
|
+
とするところを、以下のように修正すればよいかと思います。
|
40
40
|
|
41
41
|
|
42
42
|
|
5
テキスト修正
test
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
さはさりながら、`_.filter` の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使
|
89
|
+
さはさりながら、`_.filter` の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使って以下のように書けます。この場合は lodashは不要になります。
|
90
90
|
|
91
91
|
```javascript
|
92
92
|
|
4
テキスト修正
test
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
_.filter の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
89
|
+
さはさりながら、`_.filter` の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
90
90
|
|
91
91
|
```javascript
|
92
92
|
|
3
テキスト修正
test
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
_.filter の第2引数に関数を渡すのであれば、JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
89
|
+
_.filter の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
90
90
|
|
91
91
|
```javascript
|
92
92
|
|
2
テキスト修正
test
CHANGED
@@ -77,3 +77,31 @@
|
|
77
77
|
|
78
78
|
|
79
79
|
以上参考になれば幸いです。
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
---
|
84
|
+
|
85
|
+
**追記**
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
_.filter の第2引数に関数を渡すのであれば、JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
90
|
+
|
91
|
+
```javascript
|
92
|
+
|
93
|
+
// データの中から一致するオブジェクトを検索
|
94
|
+
|
95
|
+
var results = items.filter(function(item) {
|
96
|
+
|
97
|
+
return (
|
98
|
+
|
99
|
+
(query.color.includes("") || query.color.includes(item.color)) &&
|
100
|
+
|
101
|
+
(query.type.includes("") || query.type.includes(item.type))
|
102
|
+
|
103
|
+
);
|
104
|
+
|
105
|
+
});
|
106
|
+
|
107
|
+
```
|
1
テキスト修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
まず
|
5
|
+
まず前提として、`lodash` の `where` は以下
|
6
6
|
|
7
7
|
|
8
8
|
|