こんにちは
この回答では、以下のメソッドを使います。
JQueryのメソッド:
配列のメソッド:
まずHTMLのほうの各select
に、有効な値を選んでいないときの option
を追加し、それらの value
属性を空文字列にしておきます。
html
1<select id="birthyear">
2 <option value="">---</option>
3 <option value="2000">2000</option>
4 <option value="2001">2001</option>
5 <option value="2001">2002</option>
6 </select>
7
8<select id="birthmonth">
9 <option value="">--</option>
10 <option value="1">1</option>
11 <option value="2">2</option>
12 <option value="3">3</option>
13 </select>
14
15<select id="birthday">
16 <option value="">--</option>
17 <option value="1">1</option>
18 <option value="2">2</option>
19 <option value="3">3</option>
20</select>
21
22<p id="birth_ok">OK</p>
上記のようにした上で、select
の changeコールバックを以下のようにしておきます。
javascript
1const selects = '#birthyear, #birthmonth, #birthday';
2
3$(selects).change(function() {
4
5 const values = $(selects).map((i,e) => e.value).get();
6
7 if (values.every(v => v)) {
8 $('#birth_ok').show();
9 } else {
10 $('#birth_ok').hide();
11 }
12
13});
上記で、以下の行
javascript
1const values = $(selects).map((i,e) => e.value).get();
によって、values
に、3つのselect
の各選択値を要素とする配列を取得できます。たとえば、年月日の年に 2001
、月に3
が選ばれており、日はまだ選ばれていないとすると、values
は ["2001", "3", ""]
になります。
「OK」を表示するのは、この配列values
の要素の全てが空文字列でないときです。そのような条件式は
javascript
1if (values.every(v => v.length > 0)) {
となりますが、ちょっと横着すると、以下のようにも書けますので、上記ではこれを使っています。
javascript
1if (values.every(v => v)) {
または、 includes を使うと、以下のように書けます。
javascript
1 if (values.includes('')) {
2 $('#birth_ok').hide();
3 } else {
4 $('#birth_ok').show();
5 }
追記
上記のコードでは、いったん配列values
を作りましたが、これを作らずに、以下のように書くこともできます。
javascript
1 $(selects).change(function() {
2
3 if ($(selects).get().every(e => e.value)) {
4 $('#birth_ok').show();
5 } else {
6 $('#birth_ok').hide();
7 }
8
9 });
追記2
ご質問に挙げられているコードをなるべく活かす修正を追記しておきます。
以下のif
で判定する条件の部分
javascript
1$('#birthyear , #birthmonth, #birthday').children(':selected').val() == ''
で、 右辺の空文字列''
と比較している、左辺
$('#birthyear , #birthmonth, #birthday').children(':selected').val()
は、 #birthyear
の select で選ばれている option の値になるので、意図した比較になりません。
どのように修正すればよいかというと、
$('#birthyear , #birthmonth, #birthday').children(':selected')
は、option を3つ含んでいますが、これら3つのoptionのうち、少なくとも1つは、そのvalueが空文字列である、という判定をするように、下記のように修正します。
javascript
1$('#birthyear, #birthmonth, #birthday').children(':selected').get().some(e => e.value === '')