プロが教える店舗&オフィスのセキュリティ対策術

初心者です。
イヌでもわかる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>


よろしくご教授くださいませ。

A 回答 (4件)

ごめんなさい。


バグちゃってますね。
閏年判定のファンクションが・・・・
//閏年チェック
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;
}
}
です^^;;
    • good
    • 0
この回答へのお礼

お礼が遅れまして、失礼いたしました。
ありがとうございました。
無事、望む形が作れました。
日々勉強してまいりますので、またの機会があれば、よろしくお願いいたします。

お礼日時:2008/05/20 14:16

それでしたらアラートの部分を消して


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>
    • good
    • 0
この回答へのお礼

丁寧な回答をいただきまして、ありがとうございました。
実際、動かしてみたとき、2000年の生まれ年の場合の年齢が出ませんでした…。
その他の年については、閏年も不正月日もはじかれて、感動しました。
自分では、まだこのようには作れませんので…。

お礼日時:2008/05/16 09:26

補足が出る前にある程度できてしまったので参考までにソースを載せておきます。


コピペして動かしてみてから解析してください。
ちなみに日付チェックで閏年及び月判定も行っています。
例えば閏年なら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)となるように設定したいと思ったのですが…。

とりあえず、アラートを出すやり方を動かしてみて、考えてみます。
とはいえ、初心者ですのでどの程度できるか…。
もしお時間が許すようであれば、引き続きよろしくお願いいたします。

補足日時:2008/05/15 17:30
    • good
    • 0

補足お願いします。


1.入力できないとは不正な文字又はありえない数値が入力されたらエラーメッセージを出して計算させないようにする事と理解して良いか

2.入力エラーはすべての入力が終了し、計算処理に入る前にまとめてチェックするのか、それとも各項目入力時にそれぞれチェックさせるのか

この2点の回答お願いします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!