- ベストアンサー
【javascript】年齢計算プログラム 改造方法と考え方を教えてください
- javascript初心者がイヌでもわかるjavascript講座(http://www.red.oit-net.jp/tatsuya/java/)を参考にして、年齢計算のプログラムを作成しています。
- しかし、閏年がない年や誤った日付の入力ができてしまい、正確な日付を制限したいです。
- インターネットで調べても解決策が見つからず困っているので、改造方法や考え方を教えていただければ幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
それでしたらアラートの部分を消して document.myFormAge.名前.value = ""; に置き換えればいけますよ。 答え合わせ用に修正版のソースをJavaScript部分だけ記述しておきますね。 <script language="javascript"> <!-- //日入力後日の数値チェック及び日付が正しいかをチェック:エラー無しなら年齢計算開始 function myAge(N){ var strValue = document.myFormAge.myAgeD.value; var strValueY = document.myFormAge.myAgeY.value; var strValueM = document.myFormAge.myAgeM.value; if (!chkDigit(strValue)) { //alert("数値以外が含まれてます"); document.myFormAge.myAgeM.value = ""; document.myFormAge.myAgeM.focus(); return; } else if (strValueY == "" || strValueM == "" || strValue == "") { //alert("未入力項目があります"); if (strValueY == "") { document.myFormAge.myAgeY.focus(); } else if (strValueM == "") { document.myFormAge.myAgeM.focus(); } else { document.myFormAge.myAgeD.focus(); } return; } else if (strValue < 0 || strValue > 31) { //alert("不正な日付が入力されています"); document.myFormAge.myAgeD.value = ""; document.myFormAge.myAgeD.focus(); return; } else { var uru = chkUru(strValueY); if (uru) { if (strValueM == 2 && strValue > 29) { //alert("不正な日付が入力されています"); document.myFormAge.myAgeD.value = ""; document.myFormAge.myAgeD.focus(); return; } } else { if (strValueM == 2 && strValue > 28) { //alert("不正な日付が入力されています"); document.myFormAge.myAgeD.value = ""; document.myFormAge.myAgeD.focus(); return; } } if ((strValueM == 4 || strValueM == 6 || strValueM == 9 || strValueM == 11) && strValue > 30) { document.myFormAge.myAgeDM.value = ""; //alert("不正な日付が入力されています"); document.myFormAge.myAgeD.focus(); return; } } //現在から、誕生日を引き、基準日に足す //つまり、現在から、誕生日の日にち分の時間だけ引く Today = new Date(); myBirth = new Date(1970 , 0 , document.myFormAge.myAgeD.value ); myBirth.setTime(Today.getTime()-myBirth.getTime()); //求めた年月日から基準日を引く myYear = myBirth.getUTCFullYear() - document.myFormAge.myAgeY.value; myMonth = myBirth.getUTCMonth() - (document.myFormAge.myAgeM.value - 1); if(myMonth < 0){ //月がマイナスなので年から繰り下げ myYear --; myMonth += 12; } myDate = myBirth.getUTCDate(); document.myFormAge.Age.value = ""+myYear+""; } //年入力後のチェック function checky() { var strValue = document.myFormAge.myAgeY.value; if (!chkDigit(strValue)) { //alert("数値以外が含まれてます"); document.myFormAge.myAgeY.value = ""; document.myFormAge.myAgeY.focus(); return; } } //月入力後のチェック function checkm() { var strValue = document.myFormAge.myAgeM.value; if (!chkDigit(strValue)) { //alert("数値以外が含まれてます"); document.myFormAge.myAgeM.value = ""; document.myFormAge.myAgeM.focus(); return; } if (strValue < 0 || strValue > 12) { //alert("正しい月を入力してください"); document.myFormAge.myAgeM.value = ""; document.myFormAge.myAgeM.focus(); return; } } //数字判定:数字のみならtrueを返す function chkDigit(txt) { for (i=0; i<txt.length; i++) { c = txt.charAt(i); if ("0123456789".indexOf(c,0) < 0) { return false; } } return true; } //閏年チェック function chkUru(y) { if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) { if (flag) { return true; } else { return false; } } } //--> </SCRIPT>
その他の回答 (3)
- hisajiro
- ベストアンサー率37% (124/329)
ごめんなさい。 バグちゃってますね。 閏年判定のファンクションが・・・・ //閏年チェック function chkUru(y) { if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) { if (flag) { return true; } else { return false; } } } ではなく正しくは //閏年チェック function chkUru(y) { if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) { return true; } else { return false; } } です^^;;
お礼
お礼が遅れまして、失礼いたしました。 ありがとうございました。 無事、望む形が作れました。 日々勉強してまいりますので、またの機会があれば、よろしくお願いいたします。
- hisajiro
- ベストアンサー率37% (124/329)
補足が出る前にある程度できてしまったので参考までにソースを載せておきます。 コピペして動かしてみてから解析してください。 ちなみに日付チェックで閏年及び月判定も行っています。 例えば閏年なら2月は29日まで入力可、それ以外は28まで。 4,6,9,11月は30まで入力可、 1,3,5,7,8,10,12月は31まで可にしてあります。 <HTML> <HEAD> <TITLE></TITLE> <script language="javascript"> <!-- //日入力後日の数値チェック及び日付が正しいかをチェック:エラー無しなら年齢計算開始 function myAge(N){ var strValue = document.myFormAge.myAgeD.value; var strValueY = document.myFormAge.myAgeY.value; var strValueM = document.myFormAge.myAgeM.value; if (!chkDigit(strValue)) { alert("数値以外が含まれてます"); document.myFormAge.myAgeM.focus(); return; } else if (strValueY == "" || strValueM == "" || strValue == "") { alert("未入力項目があります"); if (strValueY == "") { document.myFormAge.myAgeY.focus(); } else if (strValueM == "") { document.myFormAge.myAgeM.focus(); } else { document.myFormAge.myAgeD.focus(); } return; } else if (strValue < 0 || strValue > 31) { alert("不正な日付が入力されています"); document.myFormAge.myAgeD.focus(); return; } else { var uru = chkUru(strValueY); if (uru) { if (strValueM == 2 && strValue > 29) { alert("不正な日付が入力されています"); document.myFormAge.myAgeD.focus(); return; } } else { if (strValueM == 2 && strValue > 28) { alert("不正な日付が入力されています"); document.myFormAge.myAgeD.focus(); return; } } if ((strValueM == 4 || strValueM == 6 || strValueM == 9 || strValueM == 11) && strValue > 30) { alert("不正な日付が入力されています"); document.myFormAge.myAgeD.focus(); return; } } //現在から、誕生日を引き、基準日に足す //つまり、現在から、誕生日の日にち分の時間だけ引く Today = new Date(); myBirth = new Date(1970 , 0 , document.myFormAge.myAgeD.value ); myBirth.setTime(Today.getTime()-myBirth.getTime()); //求めた年月日から基準日を引く myYear = myBirth.getUTCFullYear() - document.myFormAge.myAgeY.value; myMonth = myBirth.getUTCMonth() - (document.myFormAge.myAgeM.value - 1); if(myMonth < 0){ //月がマイナスなので年から繰り下げ myYear --; myMonth += 12; } myDate = myBirth.getUTCDate(); document.myFormAge.Age.value = ""+myYear+""; } //年入力後のチェック function checky() { var strValue = document.myFormAge.myAgeY.value; if (!chkDigit(strValue)) { alert("数値以外が含まれてます"); document.myFormAge.myAgeY.focus(); return; } } //月入力後のチェック function checkm() { var strValue = document.myFormAge.myAgeM.value; if (!chkDigit(strValue)) { alert("数値以外が含まれてます"); document.myFormAge.myAgeM.focus(); return; } if (strValue < 0 || strValue > 12) { alert("正しい月を入力してください"); document.myFormAge.myAgeM.focus(); return; } } //数字判定:数字のみならtrueを返す function chkDigit(txt) { for (i=0; i<txt.length; i++) { c = txt.charAt(i); if ("0123456789".indexOf(c,0) < 0) { return false; } } return true; } //閏年チェック function chkUru(y) { if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) { if (flag) { return true; } else { return false; } } } //--> </SCRIPT> </HEAD> <BODY> <FORM name="myFormAge"> 生年月日を入力してください。 <br> <br> 年(西暦)<INPUT type="text" size="4" name="myAgeY" onBlur="checky()"> 月<INPUT type="text" size="2" name="myAgeM" onBlur="checkm()"> 日<INPUT type="text" size="2" name="myAgeD" onBlur="myAge(this.form)"> <br> <br> <br> <br> <br> <INPUT type="text" size="5" name="Age">歳 </FORM> </BODY> </HTML>
補足
ソース、ありがとうございます。 勉強になります。 遅くなりましたが、補足の件です。 アラートを出すのではなく、間違ったものを入力できない、 即ち2月29日と入れると2月 日(テキストボックス内がNULL)となるように設定したいと思ったのですが…。 とりあえず、アラートを出すやり方を動かしてみて、考えてみます。 とはいえ、初心者ですのでどの程度できるか…。 もしお時間が許すようであれば、引き続きよろしくお願いいたします。
- hisajiro
- ベストアンサー率37% (124/329)
補足お願いします。 1.入力できないとは不正な文字又はありえない数値が入力されたらエラーメッセージを出して計算させないようにする事と理解して良いか 2.入力エラーはすべての入力が終了し、計算処理に入る前にまとめてチェックするのか、それとも各項目入力時にそれぞれチェックさせるのか この2点の回答お願いします。
お礼
丁寧な回答をいただきまして、ありがとうございました。 実際、動かしてみたとき、2000年の生まれ年の場合の年齢が出ませんでした…。 その他の年については、閏年も不正月日もはじかれて、感動しました。 自分では、まだこのようには作れませんので…。