- 締切済み
年齢計算
超・初心者です。 http://oshiete1.goo.ne.jp/qa4023599.html 上記頁のご質問を参考にして、functionでbody部分テキストフォームの情報を得るか、getElementByIDを用るかして、汎用的なものを作成したいと思ったのですが、値が取れず、うまくいきませんでした。 元のソースを載せますので、ご教授ください。 よろしくお願いします。 <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)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
ばっさり方向転換して・・・こんなんでどうでしょう? //hoge.htm <HTML> <HEAD> <script type="text/javascript" src="hoge.js"></script> </HEAD> <BODY> <FORM> 生年月日を入力してください。 <br> <br> 年(西暦)<INPUT type="text" size="4" name="myAgeY" onKeyup="getAge(this)"> 月<INPUT type="text" size="2" name="myAgeM" onKeyup="getAge(this)"> 日<INPUT type="text" size="2" name="myAgeD" onKeyup="getAge(this)"> <br> <br> <br> <br> <br> <INPUT type="text" size="5" name="Age">歳 </FORM> </BODY> </HTML> //hoge.js function getAge(obj){ var v=obj.value; var f=obj.form; obj.value=v.replace(/[^\d]/,""); var birthdayObj=getBirthday(f); if(birthdayObj){ todayObj=new Date(); todayY=todayObj.getFullYear(); birthdayY=birthdayObj.getFullYear(); birthdayObj.setYear(todayY); f.Age.value=todayY - birthdayY - 1 +(birthdayObj<=todayObj); }else{ f.Age.value=""; } } function getBirthday(f){ var y=parseInt(f.myAgeY.value); var m=parseInt(f.myAgeM.value); var d=parseInt(f.myAgeD.value); birthdayObj=new Date(); birthdayObj.setYear(y); birthdayObj.setMonth(m-1); birthdayObj.setDate(d); if(birthdayObj.getFullYear()!=y || y<1900) return false; if(birthdayObj.getMonth()!=m-1) return false; if(birthdayObj.getDate()!=d) return false; return birthdayObj; }
- nda23
- ベストアンサー率54% (777/1415)
閏年チェックの中でflagという変数を使っていますが、これが未定義です。 以下、気になった点を列挙します。 (1)数字チェック 正規化を使うべきです。 function chkDigit(txt) { //非数字の位置を検索し、見つかったらfalseを返す。 if( txt.search(/\D/) >= 0 ) return false; //上記以外(非数字が見つからない)はtrueを返す。 return true; } (2)変数の型 変数の型について、注意を払うべきです。 if (strValue < 0 || strValue > 31) ↓ var numValue = parseInt(strValue); //数値に変換 if( numValue < 0 || numValue > 31 ) (3)switchを使う if ((strValueM == 4 || strValueM == 6 || strValueM == 9 || strValueM == 11) ~ ↓ switch( parseInt(strValueM) ) { case 4: case 6: case 9: case 11: if( numValue > 30 ) ~ break; case 2: var uru = chkUru(strValueY); //閏年は2月だけでよい if( numValue > 29 ) ~ break;
お礼
ご返答をありがとうございます。 よくわからずに参考にしていたので…。 こういうところに気をつけなければならないのですね。 勉強します。 ありがとうございます。