
初心者です。
イヌでもわかる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>
よろしくご教授くださいませ。
No.3ベストアンサー
- 回答日時:
それでしたらアラートの部分を消して
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>
丁寧な回答をいただきまして、ありがとうございました。
実際、動かしてみたとき、2000年の生まれ年の場合の年齢が出ませんでした…。
その他の年については、閏年も不正月日もはじかれて、感動しました。
自分では、まだこのようには作れませんので…。
No.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;
}
}
です^^;;
お礼が遅れまして、失礼いたしました。
ありがとうございました。
無事、望む形が作れました。
日々勉強してまいりますので、またの機会があれば、よろしくお願いいたします。
No.2
- 回答日時:
補足が出る前にある程度できてしまったので参考までにソースを載せておきます。
コピペして動かしてみてから解析してください。
ちなみに日付チェックで閏年及び月判定も行っています。
例えば閏年なら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)となるように設定したいと思ったのですが…。
とりあえず、アラートを出すやり方を動かしてみて、考えてみます。
とはいえ、初心者ですのでどの程度できるか…。
もしお時間が許すようであれば、引き続きよろしくお願いいたします。
No.1
- 回答日時:
補足お願いします。
1.入力できないとは不正な文字又はありえない数値が入力されたらエラーメッセージを出して計算させないようにする事と理解して良いか
2.入力エラーはすべての入力が終了し、計算処理に入る前にまとめてチェックするのか、それとも各項目入力時にそれぞれチェックさせるのか
この2点の回答お願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- PHP php ログイン 1 2022/11/01 00:24
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
return trueとreturn falseの用...
-
「本当に削除しますか」が正常...
-
チェックボックスの有無判定
-
入力された日付の正規表現の仕...
-
slickのレスポンシブ > center...
-
半角数字以外の文字をチェック...
-
チェックボックスのチェック。...
-
チェックに応じて違うチェック...
-
Tabキーでのカーソルの移動...
-
IE6+VBScript環境でF5を効かな...
-
フォームの入力チェックをする...
-
onSubmit=の後ろは複数可能でし...
-
文字列がA-F 0-9であるかチェ...
-
Nullの回避方法
-
2次元配列で2項目についてソー...
-
新しくフォルダを作成したい
-
<input>の選択肢をプルダウンメ...
-
文字数を数える際に空白、改行...
-
Selectボックスの幅を自動で広...
-
プルダウンで選択すると、DBの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
return trueとreturn falseの用...
-
slickのレスポンシブ > center...
-
TEXTAREAに入力した改行コード...
-
COBOLの数字チェック
-
ツリービューのチェックボック...
-
2次元配列で2項目についてソー...
-
Visual Studioのデザインでの非...
-
onSubmit=の後ろは複数可能でし...
-
分岐数といえば
-
フォームの入力チェックをする...
-
ラジオボタンのNullチェック
-
ctrl+vを無効にする方法
-
度胸試しのJavaScript
-
JavaScriptde途中で、「exit」...
-
未選択のプルダウンメニューを...
-
IE7のJavascriptで return fals...
-
未入力のラジオボタンに、alert...
-
テキストボックスに数字しか入...
-
変数の値によってsubmit後の動...
-
リロードしないようにするには
おすすめ情報