JavaScript初心者が誕生日関数で問題に直面!解決策は?

このQ&Aのポイント
  • JavaScript初心者が誕生日勘定関数とうるう年対応関数を組み合わせるとエラーが発生する問題に直面しました。
  • 誕生日勘定関数を単独で使用する場合は正常に動作することを確認しましたが、うるう年対応関数を組み込んだ場合にエラーが発生します。
  • この問題を解決するためには、誕生日勘定関数とうるう年対応関数の組み合わせにおいて、正しい条件分岐が必要です。
回答を見る
  • ベストアンサー

JavaScript初心者です。質問が

あります。 誕生日勘定関数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>

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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();… こんな感じでどうでしょう? 最低限ならこの程度の修正でどうですか?

pwjop7
質問者

お礼

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

その他の回答 (1)

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

ロジックがグダグダですね・・・ もうすこし整理した方がよいですね たとえばこんな感じでどうでしょう? <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>

pwjop7
質問者

お礼

ご回答ありがとうございます。 正しい月日の絞り込みは分かりました。一生懸命に勉強します。 しかしこのスクリプトでしたいことは、昨年、今年、来年の誕生日のうち近いものからのコメントを表示することがしたいのです。最も小さい数値で表現するということです。絶対値比較はそのためのものです。 うるう年2月29日生まれに対応すべく、 a>0,a==0,a<0で判別後に、西暦年を4の剰余算でその年のその日の状況に応じて、最も小さい数値で=もっとも近い誕生日からのコメント表現にしたいということです。 うるう年関数では西暦年4の剰余算2年で2月28日までは、経過コメント、同年3月1日からはカウントダウンコメントにしたいということです。 うるう年の半分の切り替えポイントは西暦年剰余算2年2月29日です=存在しませんが。

関連するQ&A

  • カウントダウンのタグ

    おバカな質問でごめんなさいです(T_T) 笑わないでね?! 呆れないでね?! カウントダウンのカウンター(?)を置きたくて いろんなサイトを見て作ろうと思ったのですが これじゃ~表示されなくて… 何が足りないですか? ()の中ってどうするのですか? たぶん… メチャクチャだと思うのでここに質問すること事態 恥ずかしくて迷いましたが宜しくお願いします。 m( _"_ )mペコ♪ <!-- var set_y = 2005; var set_m = 9; var set_d = 5; var now = new Date(); var spday= new Date(set_y,set_m-1,set_d); a = (spday.getTime() - now.getTime())/(24*60*60*1000); a= Math.ceil(a); if(a >0) document.write("あと",a,"日で○○○です。"); else if(a==0) document.write("<h2>○○○開催!!</h2>"); else if(a <0) document.write("○○○",-a,"日過ぎました・・・"); --> <script language="javascript"> <!-- //--> </script>

    • ベストアンサー
    • HTML
  • document.write()の()内にタグを使用したいのですが

    質問いたします。 カウントダウンに関する質問なのですが、例えば以下のスクリプトの中でdocument.write()の()内の".happy."の部分の色を変えたいのですが、タグの挿入のルールが解りません。 document.write("誕生日まであと",<font color="#FF0000">happy</font>," 日") とか色々何パターンか試して見たのですが、間違っているようで表示されなくなってしまいます。 <SCRIPT language="JavaSCRIPT"> <!---- var set_y = 2006; //年 var set_m = 10; //月 var set_d = 01; //日 var now = new Date(); var spday= new Date(set_y,set_m-1,set_d); happy = (spday.getTime() - now.getTime())/(24*60*60*1000); happy = Math.ceil(happy); if(happy >0) document.write("誕生日まであと ",happy," 日"); //カウントダウン else if(happy ==0) document.write("誕生日おめでとう"); //当日 else if(happy <0) document.write("来年もよろしくね!"); //その後 //------> </script> 適切な場所に<font color="#FF0000">~</font>を入れる書き方をお教え頂ければ幸いでございます。よろしくお願い致します。

  • JavaScriptでイベントまでのカウントを作りたい。

    教えてください。JavaScript初心者です。 JavaScriptでイベントまでのカウントを作りたいのですが、 日にちを画像でだして、指定した日がきたら、画像で差し替えるようにしたいのですが、どうすればいいのでしょうか? ※現在は指定した日がきたら、「おめでとう」の文字がでるようにしてます。 書いたタグは下記になります。 アドバイスをお願いします。 <script language="JavaScript"><!-- var now = new Date(); var point = new Date(2009,8-1,25); var countdown = Math.ceil( ( point.getTime() - now.getTime() ) / (1000*60*60*24) ); if(countdown > 0) { document.write('countdown '); } else { document.write('おめでとう!'); } // --></script>

  • カウントダウン JavaScript の else if 3行目以降が実行されない

    ホームページに以下のようなJavaScriptを実行したいのですが、else if の3行目以降が実行されません。 3行目以降も実行するには、どこを修正したら宜しいのでしょうか? <script language="javascript"> <!-- var set_y = 2009; var set_m = 4; var set_d = 10; var now = new Date(); var spday= new Date(set_y,set_m-1,set_d); a = (spday.getTime() - now.getTime())/(24*60*60*1000); a= Math.ceil(a); if(a >0) document.write('大会まで<BR>あと</FONT><FONT size="7" color="#ccff00" face="Arial">', a,'</FONT><FONT size="6" color="#ffffff" face="Arial">日') else if(a==0) document.write('本日は、大会1日目<BR><FONT size="4"> </FONT><BR><FONT size="5">跳躍競技</FONT><BR></FONT><FONT size="7" color="#ccff00" face="Arial">走り幅跳び</FONT>') else if(a=-1) document.write('本日は、大会2日目<BR><FONT size="4"> </FONT><BR><FONT size="5">跳躍競技</FONT><BR></FONT><FONT size="7" color="#ccff00" face="Arial">走り高跳び</FONT>') else if(a=-2) document.write('本日は、大会3日目<BR><FONT size="4"> </FONT><BR><FONT size="5">投擲競技</FONT><BR></FONT><FONT size="7" color="#ccff00" face="Arial">砲丸投げ</FONT>') else if(a=-3) document.write('本日は、大会4日目<BR><FONT size="4"> </FONT><BR><FONT size="5">投擲競技><BR></FONT><FONT size="7" color="#ccff00" face="Arial">円盤投げ</FONT>') else if(a=-4) document.write('本日は、大会5日目<BR><FONT size="4"> </FONT><BR><FONT size="5">トラック競技><BR></FONT><FONT size="7" color="#ccff00" face="Arial">110m ハードル</FONT>') else if(a=-5) document.write('本日は、大会6日目') else if(a=-6) document.write('本日は、大会7日目<BR><FONT size="4"> </FONT><BR><FONT size="5">トラック競技</FONT><BR></FONT><FONT size="7" color="#ccff00" face="Arial">10000m</FONT>') else if(a=-7) document.write('本日は、大会8日目<BR><FONT size="4"> </FONT><BR><FONT size="5">トラック競技><BR></FONT><FONT size="7" color="#ccff00" face="Arial">リレー</FONT>') </script>

  • JavaScriptがマックのサファリでは、正しく動きません。

    11月24日まで、あと何日です。というように日にちを表示させたいのですが、WindowsのIE6なら正しく日付が表示されるのですが、マックのサファリだととんでもない数字が表示されます。 どなたか、どちらでも正しく表示させられる方法を教えてください。お願いいたします。 <script language="javascript"> <!-- var sakiday = new Date("2005/11/24"); var now = new Date(); var tokuteiday = Math.floor((sakiday.getTime()-now.getTime())/(24*60*60*1000)); document.write("<b>"+tokuteiday+"</b>"); //--> </script>

  • 日付のJavaについて質問

    日付のJavaについて質問です。 <script> function makedate(){ now = new Date(); Day = 12 * 60 * 60 * 1000; now.setTime( now.getTime() + Day ); document.write("<select name=year>"); for(i = 2016; i <= 2017; i++){ Set_year = now.getYear(); Set_year = (Set_year < 2000) ? Set_year+1900 : Set_year ; if(i == Set_year){ document.write("<option value="+i+" selected>"+i); }else{ document.write("<option value="+i+">"+i); } } document.write("</select> 年"); </script> 上のような日付のプログラムを制作してみたいと思っています。 for以下のところですが、2016年⇒17年⇒18年...と年を越しても自動的に値を取得するにはどうすれば良いのでしょうか。 教えて頂ければと思います。

    • 締切済み
    • PHP
  • このjavascriptコードを短くできませんか?

    javascript初心者です。 どなたか下記のコードを短くしていただけないでしょうか? 変数1~変数12まであるので、それぞれコードを書いたら長くなってしまいました。 このままでもうまく動いてはいるのですが、もし短くできるならしたいなと思いまして。 よろしくお願いいたします。 <script type="text/javascript"> <!-- //基準になる日を設定 inputDay1 = "変数1"; //指定日を変数に var hairetu = inputDay1.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday1 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay2 = "変数2"; //指定日を変数に var hairetu = inputDay2.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday2 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay3 = "変数3"; //指定日を変数に var hairetu = inputDay3.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday3 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay4 = "変数4"; //指定日を変数に var hairetu = inputDay4.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday4 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay5 = "変数5"; //指定日を変数に var hairetu = inputDay5.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday5 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay6 = "変数6"; //指定日を変数に var hairetu = inputDay6.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday6 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay7 = "変数7"; //指定日を変数に var hairetu = inputDay7.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday7 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay8 = "変数8"; //指定日を変数に var hairetu = inputDay8.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday8 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay9 = "変数9"; //指定日を変数に var hairetu = inputDay9.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday9 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay10 = "変数10"; //指定日を変数に var hairetu = inputDay10.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday10 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay11 = "変数11"; //指定日を変数に var hairetu = inputDay11.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday11 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); inputDay12 = "変数12"; //指定日を変数に var hairetu = inputDay12.split("/"); var nowday = new Date(); //今日の日付 var xday = new Date(hairetu[0],hairetu[1] - 1,hairetu[2]);//基準になる日 var countday12 = Math.ceil((xday.getTime() - nowday.getTime()) / (1000 * 60 * 60 * 24)); if (countday1 < 0)document.write("111"); if (countday2 < 0)document.write("222"); if (countday3 < 0)document.write("333"); if (countday4 < 0)document.write("444"); if (countday5 < 0)document.write("555"); if (countday6 < 0)document.write("666"); if (countday7 < 0)document.write("777"); if (countday8 < 0)document.write("888"); if (countday9 < 0)document.write("999"); if (countday10 < 0)document.write("101010"); if (countday11 < 0)document.write("111111"); if (countday12 < 0)document.write("121212"); --> </script>

  • JavascriptからJavaへの変え方

    Javascriptで作ったものをJavaにしないといけなくなったのですが 私はJava初心者でまったくわかりません。 色々ネットで調べてみたのですが、どうも難しくて理解することができませんでした。 下にJavascriptで作ったものを載せてるのですがどなたかやり方を教えてもらえないでしょうか? <html> <head> <title>サンプル</title> <script type="text/javascript"> function jikoku() { dd = new Date(); document.F1.T1.value = dd.toLocaleString(); window.setTimeout("jikoku()", 1000); } </script> <script type="text/javascript"> mes = new Array(5); mes[0]="0"; mes[1]="1"; mes[2]="2"; mes[3]="3"; mes[4]="4"; date=(new Date()).getHours(); if( 0 <= date && date <= 5 ){ document.write(mes[0]); } else if( 6 <= date && date <= 10 ){ document.write(mes[1]); } else if( 11 <= date && date <= 16 ){ document.write(mes[2]); } else if( 17 <= date && date <= 19 ){ document.write(mes[3]); } else{ document.write(mes[4]); } </script> <script type="text/javascript"> function Random() { var kazu = Math.random(); kazu = kazu*100; kazu = Math.ceil(kazu); if( kazu<=9 ) document.write('<br/>○1<br/>'); else if( kazu<=19 ) document.write('<br/>○2<br/>'); else if( kazu<=29 ) document.write('<br/>○3<br/>'); else if( kazu<=39 ) document.write('<br/>○4<br/>'); else if( kazu<=49 ) document.write('<br/>○5<br/>'); else if( kazu<=59 ) document.write('<br/>○6<br/>'); else if( kazu<=69 ) document.write('<br/>○7<br/>'); else if( kazu<=79 ) document.write('<br/>○8<br/>'); else if( kazu<=89 ) document.write('<br/>○9<br/>'); else document.write('<br/>○10<br/>'); } Random() </script> <script language="JavaScript"> var imglist = new Array( "sample1.jpg", "sample2.jpg", "sample3.jpg", "sample4.jpg" ); var selectnum = Math.floor((Math.random() * 100)) % imglist.length; var output = "<img src=" + imglist[selectnum] + ">"; document.write(output); </script> </head> </html>

  • 曜日に関係なく、交互に表示させる。

    すみません。 思いっきり初心者です。 以前、同僚に協力してもらい、 2つの表示を1日毎に表示を変えるのを教えて貰ったんですが、 (下記内容) <!-- var now = new Date(); var xday = new Date(2004, 9-1, 15); count = Math.ceil( (xday.getTime() - now.getTime()) / (24*60*60*1000) ) var n = count % 2; if(n == 0){ document.write("<FONT style='font-size : 16px; color : #00cc00'>あ</font><BR>"); } else { document.write("い<BR>"); } //--> こんな感じでした。 これを2つ交互から <1日目:あ、2日目:い、3日目:う、4日目:あ、5日目:い、…> と表示させたいんですが、同僚は辞めてしまいどうしたらいいか解りません。 教えてください。 宜しくお願いします。

  • javascript 初心者です。

    下記のソースのどこが間違っているのでしょうか。 <body> <script type="text/javascript" language="javascript"> <!-- var us; us = document.getElementById("uuss"); if ( us == 0 ){ document.write("オッケーです。"); }else if ( us == 1 ){ document.write("エヌジーです"); }else if ( us == 2 ){ document.write("未定です"); }else if ( us == 3 ){ document.write("空欄です"); } // --> </script> <div id="uuss">1</div> </body> 例えば<div id="uuss"> </div>の部分に1と入力すると、 「エヌジーです」という文字列を表示させたいのですが ブラウザで見ると「1」と出てしまいます。 よろしくお願いします。