例えば、下記のようなHTMLだった場合、
html
1<!-- 共通クラス、numInputを当てておく -->
2<input type="tel" name="aaa" class="numInput"><br>
3<input type="tel" name="bbb" class="numInput"><br>
4<input type="tel" name="ccc" class="numInput"><br>
5<input type="tel" name="ddd" class="numInput"><br>
6<input type="tel" name="eee" class="numInput">
下記のように一括処理ができます。
javascript
1const inputs = document.querySelectorAll('.numInput');
2
3// let unInput = '';
4
5// some関数は、配列の要素を走査し、一個でもtrueがあると処理を終了し、論理値を返します。
6// つまり、false(入力がない、または0)である限り、回り続け、全てが、該当の入力なら、falseを返してくれます。
7// そして、この記述なら、NodeListにもsome関数を使用できます。
8const inputOK = [].some.call(inputs, elm => {
9 if (!elm.value || isNaN(elm.value) || Number(elm.value) == 0) {
10 return false;
11 } else {
12 // unInput = elm.name;
13 return true;
14 }
15});
16
17if (inputOK) {
18 // いずれかの入力があった
19 console.log('OK牧場');
20} else {
21 // 全ての入力が未入力、もしくは0だった
22 console.log('XXXを入力してください。');
23}
なぜ質問のコードでは理想の挙動にならないのかの解説
では、なぜ、質問のコードではうまくいかないのか。
if
は、条件が真となったら、それ以降の条件文は通らないからです。
例えば、bbb
が未入力だったとしましょう。そうするとどうなるか。
javascript
1// bbbが未入力である
2if (aaa==""){
3 console.log('XXXを入力してください');
4}else if (aaa=="0"{
5 console.log('XXXを入力してください');
6}else if (bbb==""){
7 // が通る
8 console.log('XXXを入力してください');
9}else if (bbb=="0"){
10 // ここ以降はもう通らない。そのため、OK牧場にも当然到達しない
11 console.log('XXXを入力してください');
12}else if (ccc==""){
13 console.log('XXXを入力してください');
14}else if (ccc=="0"){
15 console.log('XXXを入力してください');
16}else if (ddd==""){
17 console.log('XXXを入力してください');
18}else if (ddd=="0"){
19 console.log('XXXを入力してください');
20}else if (eee==""){
21 console.log('XXXを入力してください');
22}else if (eee=="0"){
23 console.log('XXXを入力してください');
24}else{
25 console.log('OK牧場');
26}
となるため、else if (bbb == "")
以降のelse if
条件は適用されません。
よって、あくまでif
文でやるなら、下記のようになります。
javascript
1if (
2 (aaa == "" || aaa == "0") &&
3 (bbb == "" || bbb == "0") &&
4 (ccc == "" || ccc == "0") &&
5 (ddd == "" || ddd == "0") &&
6 (eee == "" || eee == "0")
7){
8 console.log('XXXを入力してください');
9} else {
10 console.log('OK牧場');
11}
しかし、これでは、要素が増減するたびに、構文を変えねばならないので、
私の構文のように、要素の増減にも自動で処理を行える形の方がよいかと思います。