質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1851閲覧

生年月日のフォームが全て入力されているかチェックする

wshielDi

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

2クリップ

投稿2020/02/11 13:55

編集2020/02/11 13:57

#実現したいこと
![イメージ説明]
上記のような生年月日を入力するフォームが全て入力されたら右端にチェックマーク(OKマーク)を出したい

#該当のコード

html

1<select id="birthyear"> 2 <option value="2000">2000</option> 3 <option value="2001">2001</option> 4 <option value="2001">2002</option> 5 </select> 6 7<select id="birthmonth"> 8 <option value="1">1</option> 9 <option value="2">2</option> 10 <option value="3">3</option> 11 </select> 12 13<select id="birthday"> 14 <option value="1">1</option> 15 <option value="2">2</option> 16 <option value="3">3</option> 17 </select> 18<p id="birth_ok">OK</p>

javascript

1$('#birthyear , #birthmonth, #birthday').change(function() { 2 if($('#birthyear , #birthmonth, #birthday').children(':selected').val() == ''){ 3 $('#birth_ok').hide(); 4 } else{ 5 $('#birth_ok').show(); 6 } 7 });

このコードだと思い通り動かないのはわかるのですが、年・月・日の全てがselectされた場合のみOKを出すことができません。
ifの条件を(#birthyear).children(':selected').val() == '' && (#birthmonth).children(':selected').val() == '' && (#birthday).children(':selected').val() == ''
とかもやってみたのですが、上手くいきませんでした。

よろしくお願いいたします

pontarou3👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/11 14:10

3つに分離するのは時代遅れな気も
wshielDi

2020/02/12 11:37

カレンダー表示も検討しましたが自分の生年月日のカレンダーまで行き着くのに時間がかかってしまうので、今回の形にしました。 他に良い方法があればご教授いただけると幸いです
guest

回答1

0

ベストアンサー

こんにちは

この回答では、以下のメソッドを使います。

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 === '')

投稿2020/02/11 15:12

編集2020/02/12 00:10
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wshielDi

2020/02/12 11:58

とても丁寧な解説をありがとうございます。 コードの意味も理解でき、理想通りの動きができました。 勉強になります! 本当にありがとうございました。
jun68ykt

2020/02/12 13:45

どういたしまして。 > コードの意味も理解でき、理想通りの動きができました。 とのことでよかったです????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問