アプリ版:「スタンプのみでお礼する」機能のリリースについて

あります。
誕生日勘定関数birth()、
うるう年対応関数uruu()
はそれぞれ単独で作動することを確認しています。
がbirth()にuruu()を組み込むと作動しなくなります。
どうしたら解決するのでしょうか?
<script language="JavaScript">
<!--
function birth(){
set_m = eval(document.myForm.formm.value);
set_d = eval(document.myForm.formd.value);

if(set_m<1 || set_m>12){
alert("正しい月日を入力してください!");
return false;
}
if(set_m ==2 && set_d>29){
alert("正しい月日を入力してください!");
return false;
}
if(set_m ==1 | set_m ==3 | set_m ==5 | set_m ==7 | set_m ==8 | set_m ==10 |set_m ==12){
if(set_d<1 || set_d>31){
alert("正しい月日を入力してください!");
return false;
}
}else if(set_d <1 | set_d>30){
alert("正しい月日を入力してください!");
return false;
}
if(set_m ==2 && set_d ==29)
uruu();
else if{
now = new Date();
b = now.getYear();
spday= new Date (b,set_m-1,set_d);
spday2 = new Date(b-1,set_m-1,set_d);
spday3 = new Date(b+1,set_m-1,set_d);
a = (spday.getTime() - now.getTime())/(24*60*60*1000);
a = Math.ceil(a);
c = (spday2.getTime() - now.getTime())/(24*60*60*1000);
c = Math.ceil(c);
d = (spday3.getTime() - now.getTime())/(24*60*60*1000);
d = Math.ceil(d)

aa = Math.abs(a);
cc = Math.abs(c);
dd = Math.abs(d);

if(aa==0) document.write("誕生日おめでとう!!");
else if( a<0 && dd>aa && aa<cc) document.write("誕生日から",aa,"日過ぎました・・・");
else if(a<0 && aa>=dd && dd<cc) document.write("あと",dd,"日で誕生日です。");
else if(aa<=cc && aa<dd) document.write("あと",aa,"日で誕生日です。");else if(aa>cc && cc<dd ) document.write("誕生日から",cc,"日過ぎました・・・");
}

}

function uruu(){
now = new Date();
b = now.getYear();
spday = new Date(b,2-1,29);
a = (spday.getTime()- now.getTime())/(24*60*60*1000);
a = Math.ceil(a);
aa = Math.abs(a);

if(a<0){
if(b%4==0)
document.write("誕生日から",aa,"日経過しました。");
else if(b%4==1)
document.write("誕生日から",365+aa,"日経過しました。");
else if(b%4==2)
document.write("あと",365+365-aa,"日で誕生日です。");
else if(b%4==3)
document.write("あと",365-aa,"日で誕生日です。");
}else if(a>0){
if(b%4==0)
document.write("あと",aa,"日で誕生日です。");
else if(b%4==1)
document.write("誕生日から",365-aa,"日経過しました。");
else if(b%4==2)
document.write("誕生日から",365+365-aa,"日経過しました。");
else if(b%4==3)
document.write("あと",365+aa,"日で誕生日です。");
}else if(a==0)
document.write("誕生日おめでとう!!");

}
-->
</script>

<form name="myForm">
<input type="text" name="formm" size=2>月
<input type="text" name="formd" size=2>日
<input type="button" value="誕生日勘定する" onClick="birth()">
</form>

A 回答 (2件)

はじめまして。



これ自体は

if(set_m ==2 && set_d ==29)
uruu();
else if{
   ↑このifを削除すれば動きます。

=======

でも空白や数字以外でボタン押されるとエラーになるので

set_m = document.myForm.formm.value;
set_d = document.myForm.formd.value;

if(set_m<1 || set_m>12 ||set_m==""||set_m.match(/[0-9]+/g)!=set_m){
alert("正しい月を入力してください!");
return false;
}else{
set_m=Math.floor(set_m,0);
}

if(set_d<1 || set_m>32 || set_d==""||set_d.match(/[0-9]+/g)!=set_d){
alert("正しい日を入力してください!");
return false;
}else{
set_d=Math.floor(set_d,0);
}

if(set_m ==2 && set_d>30){
alert("正しい日を入力してください!");
return false;
}else if((set_m ==4 || set_m ==6 || set_m ==9 || set_m ==11)&&(set_d>31)){
alert("正しい日を入力してください!");
return false;
}else if(set_m ==2 && set_d==29){
uruu();
}else{

now = new Date();…

こんな感じでどうでしょう?

最低限ならこの程度の修正でどうですか?
    • good
    • 0
この回答へのお礼

勉強中の身なのでmatch()など
初めて調べて納得しているところです。
本当に初心者ならではのミスで、申し訳ありません。
少しづつ身に着けていきます。
本当にありがとございました。m(__)mペコリ

お礼日時:2012/05/08 18:08

ロジックがグダグダですね・・・


もうすこし整理した方がよいですね
たとえばこんな感じでどうでしょう?

<script>
function birth(){
var set_m = parseInt(document.getElementById('myForm').elements['formm'].value);
var set_d = parseInt(document.getElementById('myForm').elements['formd'].value);
var theday=new Date();
var today=new Date();
theday.setMonth(set_m -1);
theday.setDate(set_d);
if(theday.getMonth()!=set_m -1 || theday.getDate()!=set_d){
alert("正しい月日を入力してください!");
return false;
}
var a=(theday - today)/(60*60*24*1000);
if(a==0){
alert("誕生日おめでとう!!");
}else if(a>0){
alert("あと"+a.toString()+"日で誕生日です。");
}else{
alert("誕生日から"+(-a).toString()+"日経過しました。");
}
}
</script>

<form id="myForm">
<input type="text" name="formm" size=2>月
<input type="text" name="formd" size=2>日
<input type="button" value="誕生日勘定する" onClick="birth()">
</form>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
正しい月日の絞り込みは分かりました。一生懸命に勉強します。

しかしこのスクリプトでしたいことは、昨年、今年、来年の誕生日のうち近いものからのコメントを表示することがしたいのです。最も小さい数値で表現するということです。絶対値比較はそのためのものです。

うるう年2月29日生まれに対応すべく、
a>0,a==0,a<0で判別後に、西暦年を4の剰余算でその年のその日の状況に応じて、最も小さい数値で=もっとも近い誕生日からのコメント表現にしたいということです。
うるう年関数では西暦年4の剰余算2年で2月28日までは、経過コメント、同年3月1日からはカウントダウンコメントにしたいということです。
うるう年の半分の切り替えポイントは西暦年剰余算2年2月29日です=存在しませんが。

お礼日時:2012/05/08 17:51

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