Site icon Tips Note by TAM

フォームで無効な日付を選択させない

日付を選択するボックスが年、月、日と分かれていた場合、
無効な日付を選択することができてしまいます。(2月31日など)

Javascriptを利用して選択できないようにする方法を紹介します。

今回は無効な日付を選択した場合は、選択したボックスを空にしています。
応用すればアラートを出す、またはエラーテキストを表示するなどができると思います。

処理の流れは選択した値を変数「y、m、d」に入れ、すべて選択されていたらDate()に選択値を入れる。
Date()で取得した日付をdsに入れ、年、月、日を取得する ※getFullYear()getMonth()getDate()
選択値とDate()で取得した値(ds)を比較して、一致していなければ選択したselectのvalueを空にする。
※4月31日は5月1日になって返ってくるので、存在しないことが判定できます。

function dateValidation( element, year, month, day ) {

    var y = document.getElementsByName( year )[0].value;
    var m = document.getElementsByName( month )[0].value;
   var d = document.getElementsByName( day )[0].value;

 if ( y && m && d ) {
        var ds = new Date( y, m-1, d );
     if ( ds.getFullYear() != y || ds.getMonth() != m-1 || ds.getDate() != d ) {
         return element.value = '';
        }
   }
}

onchangeでdateValidation( 選択した要素, 年のselect[name], 月のselect[name], 日のselect[name] )を処理させます。

<select name="year1" onchange="dateValidation(this, 'year1', 'month1', 'day1')">
<option value="">--年</option>
<option value="2014">2014年</option>
<option value="2015">2015年</option>
<option value="2016">2016年</option>
</select>
<select name="month1" onchange="dateValidation(this, 'year1', 'month1', 'day1')">
<option value="">--月</option>
<option value="1">1月</option>
    <!-- 省略 -->
<option value="11">11月</option>
<option value="12">12月</option>
</select>
<select name="day1" onchange="dateValidation(this, 'year1', 'month1', 'day1')">
<option value="">--日</option>
<option value="1">1日</option>
<option value="2">2日</option>
<option value="3">3日</option>
   <!-- 省略 -->
<option value="29">29日</option>
<option value="30">30日</option>
<option value="31">31日</option>
</select>

今回のサンプル

http://tipsnote.github.io/date_validation/

リンク

[Date - JavaScript | MDN]
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date

[Date.prototype.getFullYear() - JavaScript | MDN]
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getFullYear

[Date.prototype.getMonth() - JavaScript | MDN]
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getMonth

[Date.prototype.getDay() - JavaScript | MDN]
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay