• 締切済み

年齢計算

超・初心者です。 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> 現在ショップを作っている最中なのですが、その過程で年齢計算が必要となりました。 お手数ですが、よろしくお願いいたします。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

ばっさり方向転換して・・・こんなんでどうでしょう? //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)
回答No.1

閏年チェックの中で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;

ume_ga_e
質問者

お礼

ご返答をありがとうございます。 よくわからずに参考にしていたので…。 こういうところに気をつけなければならないのですね。 勉強します。 ありがとうございます。

関連するQ&A

  • アラーと表示がうまくいきません

    <SCRIPT LANGUAGE="JavaScript"> <!-- function aaa(){ if(document.a.ADD01.selectedIndex==0){ alert("カテゴリを選んで下さい。");document.a.ADD01.focus();return false; }else if(document.a.EMAIL.value=="" &&document.a.TEL.value==""){ alert("メールアドレスか電話番を入力して下さい。"); document.a.EMAIL.focus(); return false; }else{ return true;} } // --> </SCRIPT> 上記の「メールアドレスか電話番号を入力して下さい。」のアラートを「メールアドレスを入力して下さい。」に変えたいのですが(document.a.EMAIL.value=="" && document.a.TEL.value=="")のどの部分までを消していいのか分かりません。

  • 【javascript】 年齢計算

    初心者です。 イヌでもわかるjavascript講座(http://www.red.oit-net.jp/tatsuya/java/)より拝借して、年齢計算のプログラムをつくっています。 しかし、これでやると、閏年がない年でも、フツウに計算できてしまいますし、「32日」などでも入力できてしまいます。 これを改造して、正確でない日付を入力できないようにしたいのですが、インターネットなどを調べても、どのようにしたらよいのか、見当もつかず困っております。 お手数ですが、どのようにしたらよいのか、そしてできたら、考え方などもお教えくださいませ。 以下がそのソースです。 <HTML> <HEAD> <TITLE></TITLE> <script language="javascript"> <!-- function myAge(N){ //現在から、誕生日を引き、基準日に足す //つまり、現在から、誕生日の日にち分の時間だけ引く 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+""; } //--> </SCRIPT> </HEAD> <BODY> <FORM name="myFormAge"> 生年月日を入力してください。 <br> <br> 年(西暦)<INPUT type="text" size="4" name="myAgeY"> 月<INPUT type="text" size="2" name="myAgeM"> 日<INPUT type="text" size="2" name="myAgeD" onKeyDown="myAge(this.form)"> <br> <br> <br> <br> <br> <INPUT type="text" size="5" name="Age">歳 </FORM> </BODY> </HTML> よろしくご教授くださいませ。

  • プルダウンメニューを選択していない時に送信ボタンを押した場合、(必須の)アラートを表示したい。

    過去にほぼ同じ質問がありましたが、それでも解決出来なかったので質問させていただきました。 フォームで未入力の項目に対してアラートとフォーカスされるようにしました。 そこにプルダウンメニューを加えたものを作ろうとしたのですが、アラートの内容が全部同じ(職業が選択されていません)になってしまった事と、アラートは表示されたのですが、プルダウンメニューを選択してもアラートが出続けてしまいます。 プルダウンメニューが未選択の場合にのみアラートを表示するにはどうしたらよいでしょうか。 <SCRIPT language="JavaScript"> <!-- function chkHissu(frm){ var hissu=Array('name','kana','age','mail','sex','syumi'); var hissu_nm = Array('名前','フリガナ','年齢','メールアドレス','性別','趣味'); var len=hissu.length; for(i=0; i<len; i++){ var obj=frm.elements[hissu[i]]; if(obj.type=='text' || obj.type=='textarea'){ if(obj.value==''){ alert(hissu_nm[i]+'は必須入力項目です'); frm.elements[hissu[i]].focus(); return false; } }else{ for(var j=0, chk=0; j<obj.length; j++){ if(obj[j].checked) chk++; } if(chk==0){ alert(hissu_nm[i]+'は必須入力項目です'); return false; } } } return true; } function check(value){ //数字かどうかのチェック if(isNaN(value)){ alert("数値を半角で入力してください。"); //警告コメント document.form1.age.focus(); return false; } //入力があるかどうかのチェック if(!value){ alert("年齢を入力してください。"); //警告コメント document.form1.age.focus(); return false; } } function checkAd(address){ if(!address){ alert("メールアドレスを入力してください。"); } else if(address.indexOf("@",0)<=0){ alert("メールアドレスが正しくありません。"); document.form1.mail.select(); return false; } } //-- </SCRIPT> ご存知の方がいらっしゃいましたらご教授願います。

  • 半角英数字のみの入力にエラーを返すには

    運営しているサイトに設置したコメントフォームからスパムがたくさん送信されてきます。 その対策として、「氏名のよみがな」入力欄が半角英数字のみの入力の場合にはアラートを出して投稿できないようにしたいです。 下記のようなJSを使用していますが、 if (!kana) { alert('氏名のよみがなを入力してください。'); return false; } の部分を変更して「半角英数字しか入力されていない場合、アラートを返す」ようにするには、どうしたら良いでしょうか? htmlの文字コードはShift_JISです。 よろしくお願いします。 function postComment { var name = eval('document.name.value'); var kana = eval('document.kana.value'); var email = eval('document.email.value'); var comment = eval('document.comment.value'); sum++; if (!name) { alert('氏名を入力してください。'); return false; } else { if (!kana) { alert('氏名のよみがなを入力してください。'); return false; } else { if (!email) { alert('メールアドレスを入力してください。'); return false; } else { if (!comment) { alert('コメントを入力してください。'); return false; } else { var confirm_text = '以下の内容で送信します\n' + 氏名:' + name + '\n よみがな:' + kana + '\n メール:' + email + '\n 本文:' + comment; if (!confirm(confirm_text)) { return false; } else { alert('コメントを送信しました。'); } } } } } }

  • JavaScriptでBMI計算

    初めて質問しますので無礼があるかと思いますがお許しください。 JavaScriptを独学で勉強してます。そこでBMI計算ができるようなものを下のように様々なものを参考にしてつくってみたのですが、BMIがどんな値でも”低体重”しかでません。BMIの値によってそれぞれの警告画面が出るようにしたいんです;;どうすればいいのでしょうか?よろしくお願いします。 <HTML> <HEAD> <TITLE>関数のテスト</TITLE> <SCRIPT language="JavaScript"> <!-- function test() { if (aaa.h.value == "") { alert("身長を入力してください。"); return false; } if (aaa.w.value == "") { alert("体重を入力してください。"); return false; } height = document.aaa.h.value; weight = document.aaa.w.value; bmi = weight/height/100/height/100; if (aaa.bmi.value < 18.5) {          alert("低体重。"); }else{ if (aaa.bmi.value >25) { alert("肥満"); }else{ alert("標準") } } } //--> </SCRIPT> </HEAD> <BODY> <form name="aaa"> 身長:<input name = "h"><BR> 体重:<input name = "w"><BR> <input type="button" value ="測定" onClick = "test()" > <br> BMI:<input name = "bmi"> </form> </BODY> </HTML>

  • 正規表現について

    function df(){ var sty=0; if(!document.ad.ad1.value.match(/[^0-9]+/)){ sty=1; } if(sty){ alert("違います"); return false; } else{ return ture; } } 一点だけわかりません。 (/[^0-9]+/)です。 普通に[0-9]で数字のみにすればいいのに /とか^はなんの意味があるんでしょうか?

  • javascriptをはじめて勉強しているものです。

    javascriptをはじめて勉強しているものです。 すみません。 以下のソースで、フォームがサブミットされたら、 inputの中身の値をチェックするものです。 chkValue()実行時、 emailアドレスの入力形式をチェックする関数をいれていますが、 こちらが、意図した動作をしません。(GETされてしまう) 原因教えていただきたいです。 お手数をお掛けしますが、どうぞよろしくお願いいたします。 <html> <head> <script type ="text/javascript"> <!-- function chkNum(T){ if(T.value.match(/[^0-9]/g)){ T.value=""; alert("数値以外は入力できません。"); } } function chkValue(){ if(document.myform.tboxInt.value.match(/[0-9]{4}/)){ document.myform.tboxInt.style.backgroundColor="#000"; }else{ alert("4桁の数字でないといけません。"); document.myform.tboxInt.style.backgroundColor="#f99"; document.myform.tboxInt.focus(); return false; } if(document.myform.tboxemail.value.match(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/)){ alert("ok"); }else{ document.myform.tboxEmail.value=""; alert("正しいメールアドレス形式で入力してください。"); document.myform.tboxemail.style.backgroundColor="#f99"; document.myform.tboxemail.focus(); return false; } alert(document.myform.tboxemail.value); alert("ok2") return true; } //--> </script> </head> <body> <form name="myform" onSubmit="return chkValue()"> <table border="1"> <tr> <td>数値フィールド</td> <td><input type="text" name="tboxInt" onkeyup="chkNum(this)"></td> </tr> <tr> <td>メールアドレス</td> <td><input type="text" name="tboxemail"></td> </tr> </table> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <input type="submit" value="確認"> </form> </body> </html>

  • javascriptの動作で困ってます。

    動作不良が三箇所あります。 プログラムに詳しい方がいらっしゃいましたら原因を教えて下さい。 ・未入力の質問をアラートで一括表示させたいのですが、 (3)のテキストエリアの箇所が未入力なのにアラートに表示できません。 判定のtrueとfalseを逆にして試すと、(3)のアラートは表示されるものの、記入しても アラートが出続けます。 ・1度しか指定していないにも関わらず同じ内容の警告アラートが2回出てしまう原因が分かりません。 ・入力した項目や選択した項目に関しては未入力項目のアラートとは別のアラートを用意してvalueの値をアラートで一括表示させたいのですが、関数を定義しているにも関わらず、関数が定義されていないとエラーメッセージが帰ってきて、表示されません。 ソースコードは以下になります。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> function check(){ var msg = ""; var msg2 = ""; var str = document.form.id.value; var str2 = document.form.pass.value; if (str.match(/[^0-9]+/)) { alert("客番号は数字のみ"); } if (str.length>5) { alert("客番号は4~5桁"); } if(str.length<4){ alert("客番号は4~5桁"); } if(str==""){ msg += "客番号が未入力です。\n"; }else{ msg2 += document.form.id.value; } if(str2==""){ msg += "パスワードが未入力です。\n"; }else{ msg2 += document.form.pass.value; } if(radioCheck()==false){ msg += "(1)が未入力です。\n"; } if(checkboxCheck()==false){ msg += "(2)が未入力です。\n"; } if(textareaCheck()==false){ msg += "(3)が未入力です。\n"; } if(selectCheck()==false){ msg += "(4)が未入力です。\n"; } if(msg != ""){ //メッセージを出力 alert(msg); } if(radioCheck()==true){ msg2 += document.form.eng.value ; } if(checkboxCheck()==true){ msg2 += document.form.lang.value ; } if(txtareaCheck()==true){ msg2 += document.form.opinion.value ; } if(selectCheck()==true){ msg2 += document.form.age.value ; } if(msg2 != ""){ //メッセージを出力 alert(msg2); } } function radioCheck(){ var count = 0; var eng=document.getElementsByName("eng"); for(var i=0;i<eng.length;i++){ if(eng[i].checked){ count++; } } if(count != 0){ return true; } else{ return false; } } function checkboxCheck(){ var count = 0; var checklist=document.getElementsByName("lang[]"); for(var i= 0;i<checklist.length;i++){ if(checklist[i].checked){ count++; } } if(count != 0){ return true; } else{ return false; } } function textareaCheck(){ var textarea=document.getElementById("demand").value; if(textarea!=""){ return true; } else{ return false; } } function selectCheck(){ var selectValue=document.getElementById("age").value; if(selectValue!="選択されていません"){ return true; } else{ return false; } } </script> </head> <body> <form action="http://www" method="post" name="form"onSubmit="return check()"> <h1>アンケート</h1> <p><label>客番号:<input type="text" name="id"></label></p> <p><label>パスワード:<input type="password" name="pass"></label></p> <h2>(1)</h2> <p>食べたいですか?<br> <br> <input type="radio" name="eng" value="yes"> はい <input type="radio" name="eng" value="neither"> どちらでもない <input type="radio" name="eng" value="no"> いいえ </p> <h2>(2)</h2> <p>食べたい物<br> <br> <input type="checkbox" name="lang[]" value="apple"> りんご <input type="checkbox" name="lang[]" value="banana"> バナナ <input type="checkbox" name="lang[]" value="pasta"> パスタ <input type="checkbox" name="lang[]" value="pizza"> ピザ <input type="checkbox" name="lang[]" value="supu"> スープ </p> <h2>(3)</h2> <p>意見(自由記述)<br> <textarea id="demand" name="opinion" cols="40" rows="4" maxlength="20"> </textarea> </p> <h2>(4)</h2> <p> 年齢を選択 <select id="age" name="age"> <option selected value="選択されていません">以下から選択</option> <option value="10~19才">10~19才</option> <option value="20~29才">20~29才</option> <option value="30~39才">30~39才</option> <option value="40~49才">40~49才</option> <option value="50~59才">50~59才</option> <option value="60~69才">60~69才</option> <option value="70才~">70才~</option> </select> </p> <p> <input type="submit" name="button" value="送信" onclick="check();"> <input type="reset" value="クリア"> </p> </body> </form> </html>

  • メールアドレスの入力チェックをして、正しくなければ戻る方法

    今、フォームを作っているところなのですが、 各必須事項は入力されていないと戻るように設定していますが、同じ形でメールアドレスもチェックしたいのですが、その際にxxx@***.xxxという正規の形でないと引っ掛かるようにしたいのですが、どうすればよいでしょうか?お分かりの方、是非教えてください。 よろしくお願いします。 -------------------------------------------- 現在のスクリプトは以下のような感じです。 これでは、大文字などでメールアドレスを入れられてもチェックを通してしまいますので。。 function check(){ if(document.FF.お名前_漢字.value == ""){ alert("お名前_漢字を入力してください"); document.FF.お名前_漢字.focus(); return(false); } if(document.FF.住所.value == ""){ alert("住所を入力してください"); document.FF.住所.focus(); return(false); } if(document.FF.email.value == ""){ alert("メールアドレスを入力してください"); document.FF.email.focus(); return(false); } return(true); } -------------------------------------------- そして送信ボタンを押すと、このスクリプトが働くように、 onSubmit="return check()" を設定しています。

  • 値をチェックしたい

    まったくの初心者で困っています。 それぞれ二つのテキストに、 1.空文字不可。全角かな文字以外は不可 2.空文字不可。数字と少数点以外は不可(全角の数字でも可) をつくりたいのですが、うまく作動しません。 実際のソースです↓ function check_null(){ var i; var tex = document.SForm.name.value; var tex1 = document.SForm.kukan.value; if(tex.length == 0||tex1.lenght == 0){ alert("入力されていません"); return false; }else if(tex ===" " || tex1 ===" " || tex ===" " || tex1 ===" "){ alert("スペースが入っています"); return false; }else{ return true; } } function checkHankaku(keyCode) { var a = keyCode; if(((a < 48) || (a > 57)) && a != 44 && a != 46 && a != 8){ alert("距離に数値以外の値が入っています"); return false; } } <html:form action="Addition.do" method="post" onsubmit="return check_null()"> <html:text maxlength="10" property="name" size="20"/><br> <html:text maxlength="5" property="kukan" size="10" onkeydown="checkHankaku(event.keyCode)"/><br> <html:submit value="送信"/> また、全角かなチェックのほうは、どうすればいいかもわからない状態なので、 何か良い方法がありましたらお願いします。

専門家に質問してみよう