JavaScriptのコードの意味について疑問があります

このQ&Aのポイント
  • JavaScriptのコードの意味について詳しく教えてください。
  • コードの一部にあるh.lengthとm.lengthの値をー2する理由が分かりません。
  • 回答者の方にコードの意味やー2する理由についてアドバイスをお願いします。
回答を見る
  • ベストアンサー

何故にー2なのか

<script language="JavaScript"><!-- baseURL = "image/"; ext = ".gif"; dt = new Date(); h = "0" + dt.getHours(); h = h.substring(h.length-2,h.length); m = "0" + dt.getMinutes(); m = m.substring(m.length-2,m.length); document.write("<img src='"+baseURL+h.charAt(0)+ext+"'>"); document.write("<img src='"+baseURL+h.charAt(1)+ext+"'>"); document.write("<img src='"+baseURL+"hour.gif'>"); // 時 document.write("<img src='"+baseURL+m.charAt(0)+ext+"'>"); document.write("<img src='"+baseURL+m.charAt(1)+ext+"'>"); document.write("<img src='"+baseURL+"minute.gif'>"); // 分 // --></script> 本当に質問ばかりですみません。 自分でも一応考えに考えて、それでも分からないからここに書いているという事だけはご理解して頂きたいと思う次第です。 それで、肝心な質問は、 h = "0" + dt.getHours(); h = h.substring(h.length-2,h.length); と m = "0" + dt.getMinutes(); m = m.substring(m.length-2,m.length); の substringの部分で h.lengthとm.lengthにそれぞれー2している事です。 getHours()メソッドからは、0~23の値が getMinutes()メソッドからは、0~59の値が得られますよね。 という事は、h.lengthは24、m.lengthは60となるんでしょうか。 絵は0から9までしかありません。 ちなみにsubstring(△,▲)メソッドは△から▲までの文字列を返します。 時計の場合時間を表す10の桁は1か2. 同じく分を表す10の桁は1~5ですよね。 そこで何故ー2をしなければいけないのでしょうか。 これがどういう意味を現しているのか。 謎が謎を呼んで、推理しているような気分ですけど、真面目に考えています。 どなたかこのソースコードの意味が分かる方がいましたら、アドバイスをどうぞ宜しくお願い致します。  

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

結論から言うと、時分秒を必ず2桁の文字で表すためです。 (1) h = "0" + dt.getHours();  h の内容は "00","01","02",・・・"010","011",・・・"022","023"の  いずれかになりますね。"00"~"09"はこのままでよいのですが、  "010"以降は右の2文字、言い換えると2文字目から後ろ全部が  必要ということです。 (2) h = h.substring(h.length-2,h.length);  h.length は文字数数(値ではない)を表します。  もし、"00"~"09"ならlength = 2 ですから、先の式は次のように  なります。h = h.substring(0,2);  つまり、先頭(0オリジンなので)から最後までの部分列、即ち、  全体を取り出すことになります。"010"~"023"ではlength=3に  なります。式は h = h.substring(1,3); になり、2文字目から  最後までの部分列ということになります。 (3)分と秒も同じ理屈です。 (4)以下のようになっていれば分かり易かったですか?  h = dt.getHours(); //時刻を取り出す  if ( h < 10 ) {    h = "0" + h; //10未満なら前ゼロを付ける  }  else {    h = "" + h; //10以上ならそのまま文字列化する  }

persona
質問者

お礼

凄く明快なアドバイスを頂き、ありがとうございます。 ただ、頭の部分がまだ付いていってないのでじっくり何度も読み返しながら理解していこうと思っています。 まず何故時間の変数hに0を足すのか、と思ったんですけどダブルクォーテーションで括られているので文字扱いになるんですよね。 それで0~9までは0が頭にくるためにh.lengthが2になるから、substring(2-2, 2)でその結果h.substring(0, 2)になり、charAt()メソッドによって最初の0番目=1文字目から2文字目までが返されると。 だから09になるまでは最初が0になるという事ですね。鸚鵡返しみたいですけど。 それで、10~23までになると今度はh.lengthが3になり、h.substring(3-2, 3)で結果的にh.substring(1, 3)だから2文字目から3文字目が返されると。それで再びcharAt()メソッドにより0番目=2文字目から3文字目までが返される事になるんですね。 でも、まだ疑問があります。 h = "0" + dt.getHours();により、"0"が追加されたために時間の概念が無くなってしまうのではないですか。 そうはならないですね。そうはならない。 これは、分や秒でも同じ事であるので、省略していいと。 こんな解釈でいいんですかね。 (4)のソースコードはよく理解できました。ただし、グラフィックを使うのには適さないということですね。 これで、本当に完璧に理解しているのか。 一度こんがらがると中々収拾がつかなくなるバカな頭なために本当に申し訳ありません。 数式の公式とかも変なところで躓いてしまうんですよね、全く。 プログラマーには向いていない頭かもしれませんね。 最後にsubstring()メソッドで1番目から2番目を返した場合、charAt(0)が1番目の文字に当たるわけですよね。 相当悩みながら書いたので、ここまで書くのに随分時間が取られました。 ここで書いた文章があっていれば、理解した。そうでなければ、バカは死ねって感じですかね。 本当にnda23さんには感謝します。解釈が間違いなく理解できていた場合はですけどね。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

ちょっと間違えました。 h = "" + dt.getHours(); //仮に10時なら h は文字"10"が設定される h = h + 2; //hは"102"になる。(文字の結合) 少し補足すると、おそらくグラフィックの0~9があって、それぞれ xxx0、xxx1、xxx2 というURLになっているのでしょう。それで、 文字列に対応したイメージが表示されるということだと思います。

persona
質問者

お礼

修正のレス、ありがとうございます。 やはりnda23さんぐらいになると、どういう仕組みか分かってしまうんですね。 凄いの一言です。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

だいたい合ってます。 >"0"が追加されたために時間の概念が無くなってしまうのではないですか。 DateオブジェクトからgetHours()メソッドで時間を取り出した時点で 0~23の単なる整数値になり、"0"を付けたために、整数から文字列に なったと解釈しているなら正解です。 h = dt.getHours(); //仮に10時なら h は整数値10が設定される h = h + 2; //hは 12 になる。(数値としての加算) h = "" + dt.getHours(); //仮に12時なら h は文字"12"が設定される h = h + 2; //hは"102"になる。(文字の結合) >グラフィックを使うのには適さないということですね ??? 別にどう書いても、結果が正しければよいのであって、「適す」とか 「適さない」という話ではないと思いますが・・・ 単にソース行を短くしただけじゃないですか? 私なら次のように書きます。 h = dt.getHours(); h = ( h < 10 ? "0" : "" ) + h;

persona
質問者

お礼

再度のレス、ありがとうございます。 もう1度お話が聞きたかったので、嬉しい限りです。 "0"をプラスする事により文字列になるんですね。 ここは随分考えました。そういう解釈でいいのかどうか、という点でですが。 文字の結合と言うのですね。覚えておきます。 最後のソースコードは偉く短いですね。 こんな簡単でオーケーなんですか。 ?の意味とか理解しているのでソースコードの意味が分かります。 何かソースコードが読めるってのが何か嬉しいですね。

関連するQ&A

  • ソースコードが読めません

    html> <head> <title>スクールバス時刻表</title> <script language="JavaScript"> <!-- baseURL = "image1/"; ext = ".gif"; (new image1()).src = baseURL + "6.gif"; (new image1()).src = baseURL + "7.gif"; (new image1()).src = baseURL + "8.gif"; (new image1()).src = baseURL + "9.gif"; function realTime(){ dt = new Date(); h = "0" + dt.getHours(); h = h.substring(h.length-2,h.length); m = "0" + dt.getMinutes(); m = m.substring(m.length-2,m.length); s = "0" + dt.getSeconds(); s = s.substring(s.length-2,s.length); times = [h.charAt(0),h.charAt(1),m.charAt(0),m.charAt(1),s.charAt(0),s.charAt(1)]; for (i=0; i<6; i++) document.images["RT"+i].src = baseURL + times[i] + ext; } //--> </script> </head> <body onload="setInterval('realTime()',1000)"> <table border="2" bordercolor="powderblue" cellspacing="1" width="450"> <tr bgcolor="black"><th><font color="powderblue" size="4">現在の時刻 </font> <td rowspan="2" bgcolor="white"> <font size=2> スクールバスの時刻表・運行表です。お近くのバス停をご利用ください。</font> </td> </tr> <tr> <td nowrap bgcolor="black"> <img src="image1/0.gif" name="RT0"> <img src="image1/1.gif" name="RT1"> <img src="image1/kugiri.gif"> <img src="image1/2.gif" name="RT2"> <img src="image1/3.gif" name="RT3"> <img src="image1/kugiri.gif"> <img src="image1/4.gif" name="RT4"> <img src="image1/5.gif" name="RT5"> </td> </tr> </table> <p> <table border="0" bgcolor="powderblue" cellpadding="5" width="450"> <tr> <td style="font-size:15px;line-height:130%" align="center" bgcolor="#FFFFF0"> ▼東本町方面   ▼学校町方面   ▼ニュータウン方面 </td></tr></table> </body> </html> 本当はいけないのでしょうけど、一応ソースコードを全部貼り付けてみました。 この方がプログラムの全体像が見やすいと思いまして。 それでは、質問です。 (new image1()).src = baseURL + "6.gif"; (new image1()).src = baseURL + "7.gif"; (new image1()).src = baseURL + "8.gif"; (new image1()).src = baseURL + "9.gif"; 冒頭のこの部分ですが、画像を一時ファイルとして読み込む設定と本には書かれているのですが、今一何を言っているのか分かりません。 新しいImage()メソッドを作ってそこに格納しているんですよね。でも、何故グラフィックが指定されているのでしょうか。 times = [h.charAt(0),h.charAt(1),m.charAt(0),m.charAt(1),s.charAt(0),s.charAt(1)]; for (i=0; i<6; i++) document.images["RT"+i].src = baseURL + times[i] + ext; <img src="image1/0.gif" name="RT0"> <img src="image1/1.gif" name="RT1"> <img src="image1/kugiri.gif"> <img src="image1/2.gif" name="RT2"> <img src="image1/3.gif" name="RT3"> <img src="image1/kugiri.gif"> <img src="image1/4.gif" name="RT4"> <img src="image1/5.gif" name="RT5"> これは初期値の指定でいいのでしょうか。でも、わざわざこれをする必要性があるのですかね。 いきなり、バンッと時刻を表示できないものなのでしょうか。 お訊きしたいのは以上の3点です。 どうか宜しくお願い致します。

  • function open()~ではじまるように書くには??

    お世話になっております。 この度、以下を function open()~ で書き出したいのですが、初心者のためやり方がわかりません。 また、これらをスタイルシートにて飾る方法もわからないほどの初心者です。 ものすごい初心者で、本当にお手数かけますが何卒宜しくお願い申し上げます。 <script language="JavaScript"><!-- d = (new Date()).getDay(); h = (new Date()).getHours(); m = (new Date()).getMinutes(); if (d == 3) { Discg = "tokei/close.png"; }else if ((h>12 && h<19) || (h == 12 && m >= 0) && (h == 19 && m <= 30)) { Discg = "tokei/open.png"; }else { Discg = "tokei/close.png"; } document.write('<IMG src="' + Discg + '" border="0">'); </script>

  • 作成画面の一番下に「・」?

    今HTMLとJAVASCRIPTの勉強をしています。 下記のプログラムを作りましたが画面表示すると一番下に「・」が表示されてしまいます。これはこういうものなんでしょうか?それとも消す方法あるいはプログラミング改良の方法があるのでしょうか? 下記にプログラムを示します。 <HTML> <HEAD> <TITLE>Java Script</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE="JavaScript"> var t=new Date(); var h=t.getHours(); document.write("<DIV ALIGN=right>",t,"</DIV><BR>"); document.write("<CENTER>"); if (8<h && h<12){ document.write("<H2>おはよう</H2>"); document.write("<IMG SRC='***.jpg'>"); } if (12<=h && h<=14){ document.write("<H2>こんにちは</H2>"); document.write("<IMG SRC='***.jpg'>"); } if (h<8 || 14<h){ document.write("<H2>こんばんは</H2>"); document.write("<IMG SRC='***.jpg'>"); } document.write("</CENTER>"); </SCRIPT> </BODY> </HTML>

  • 時間によって違う文章を出したい

    時間によって違う挨拶を表示したかったのですが、いざ書いてみてブラウザに表示してみると何も現れませんでした。この文章どこか間違っていますか? <script type=text/javascript>today=new Date();h=today.getHours();m=today.getMinutes();s=today.getSeconds();document.write(h,"時",m,"分",s,"秒","です--");if((h>5)&&(h<=10)){document.fgColor="#ffffff";document.write("おはようございます");}else if((h>10)&&(h<=17)){document.fgcolor="#ffffff";document.write("こんにちは");else{document.fgcolor="#ffffff";document.write("こんばんは");}</script>

  • 指定日時までのカウントダウン

    指定日時までのカウントダウンで、数字を画像で表示させたモノを作りたいのですが、 いろんなサンプル等を見ながら作ってみたものの、うまくいきません。。。 アドバイスをお願い致します。 <html> <head> <title>指定日までの残り日数+時間を画像で表示する</title> <script language="JavaScript"><!-- function xDay(y,m,d,hh,mm,ss) { today = new Date(); xday = new Date(y,m-1,d,hh,mm,ss); dayMS = (24*60*60*1000,60*60*1000); days = Math.floor((xday.getTime()-today.getTime())/(24*60*60*1000)); hours = Math.floor(((xday.getTime()-today.getTime())%(24*60*60*1000))/(60*60*1000)); minutes = Math.floor((((xday.getTime()-today.getTime())%(24*60*60*1000))/(60*1000))%60); seconds = Math.floor((((xday.getTime()-today.getTime())%(24*60*60*1000))/1000)%60%60); if (seconds<10) { seconds = "0"+seconds; } if (minutes<10) { minutes = "0"+minutes; } if (hours<10) { hours = "0"+hours; } days += ""; for (i=0; i<days.length; i++) document.write("<img src='clock/"+days.charAt(i)+".gif'>"); hours += ""; for (i=0; i<hours.length; i++) document.write("<img src='clock/"+hours.charAt(i)+".gif'>"); minutes += ""; for (i=0; i<minutes.length; i++) document.write("<img src='clock/"+minutes.charAt(i)+".gif'>"); seconds += ""; for (i=0; i<seconds.length; i++) document.write("<img src='clock/"+seconds.charAt(i)+".gif'>"); } // --></script> </head> <body> <script language="JavaScript"><!-- xDay(2008,4,21,12,00,00); // --></script> </body> </html>

  • JavaScriptの記述方法

    ソースを自分で書き写したのですが エラーが出てしまい下記のようになってしまいました。 ライン : 59 文字 : 75 エラー : 終了していない文字列型の定数です。 コード : 0 私が書き写したソース //ここから表示 document.write("<img src='"+strPicture[imgYear.substring(0,1)]+"'>"+"<img src='"+strPicture[imgYear.substring(1,2)]+"'>"+"<img src='"+strPicture[imgYear.substring(2,3)]+"'>"+"<img 元のソース //ここから表示 document.write("<img src='"+strPicture[imgYear.substring(0,1)]+"'>"+"<img src='"+strPicture[imgYear.substring(1,2)]+"'>"+"<img src='"+strPicture[imgYear.substring(2,3)]+"'>"+"<img imgの右側、半角スペース以上右側のどの部分でクリックしてもimg+半角スペースの所に点滅が表示されます。 そして、img+半角スペース点滅から「→キー」を1回押すとsrcのsとrの間に点滅が移動します。 また、imgのmとgの間からsrcのsとrの間に点滅を移動するには「→キー」を三回押さねばなりません。 エラーを無くすには、元のソースのように書けば問題解決すると思います。 色々と試してみたのですが、(半角スペースを挿入して「→キー」を1回押すとsの左側で止まってしまいました。) どうしてもわかりません。 また、メモ帳の設定は元のソースと同じく右端で折り返すにして書き写しました。 元のソースをコピペすれば、その場は解決なのですがどうしても元のソースの記述方法を知りたいです。 よろしければ教えていただけないでしょうか? お願いします。

  • 正規表現について教えてください。

    正規表現について教えてください。以下は左に配置したサムネイル(X01s、X01as、X01bs・・・)をクリックすると右にそのサムネイルの拡大画像(X01l、X01al、X01bl・・・)を表示するページです。 サムネイルのimgタグを▼以下のようにしたいと考えています。 ※makethumbnail.cgiはサムネイル作成CGI 現在:<img src="X01s.jpg"> 変更後:<img src="/makethumbnail?src=X01s.jpg&w=100&h=&type="> ▼以下はダメでした。正規表現に問題があるのでしょうか。 <img src="/makethumbnail.cgi?src=' + img + 's' + ext + '&w=100&h=&type=" class="thumbnail" onclick="changeImage(this)"> お知恵をお借りできれば幸いです。 <head> <script type="text/javascript"> location.search.match(/^\?img=([^&]+)(\.[^&\.]+)&num=(.+)$/); var img = RegExp.$1; var ext = RegExp.$2; var num = Number(RegExp.$3); function changeImage(img){ var imgsrc = img.src || img; imgsrc.match(/^(.*)s(\.[^\.]+)$/); document.main.src = RegExp.$1 + "l" + RegExp.$2; return false; } document.write = img && ext && num ? document.write : function(){}; </script> </head> <body> <table> <tr> <th> <script type="text/javascript"> /* サムネイル */ document.write('<a href="#"><img src="' + img + 's' + ext + '" class="thumbnail" onclick="changeImage(this)"></a><br /><br />'); for (var i = 1; i < num; i++) { document.write('<a href="#"><img src="' + img + String.fromCharCode(0x60 + i) + 's' + ext + '" class="thumbnail" onclick="changeImage(this)"></a><br><br>'); } </script> </td> <td> <script type="text/javascript"> /* 拡大 */ document.write('<img src="' + img + 'l' + ext + '" name="main" id="main_image" />'); </script> </td> </tr></table>

  • なぜ「ページでエラーが発生しました。」?

    字数が限られているので、「なぜエラーなのですか?」 -----ここからhead区間 <!--JavaScript Function window.onerror = null; var ver4 = (navigator.appVersion.charAt(0) >= "4"); var NN4 = ver4 && (navigator.appName.charAt(0) == "N"); var IE4 = ver4 && (navigator.appName.charAt(0) == "M"); var NN3 = ((navigator.appVersion.charAt(0) == "3") && (navigator.appName.charAt(0) == "N")); if(NN3 || NN4 || IE4){ var img_b = new Array(); img_b[0] = new Image(); img_b[0].src = "kbw.jpg" img_b[1] = new Image(); img_b[1].src = "ao.jpg" img_b[2] = new Image(); img_b[2].src = "bcw.jpg" img_b[3] = new Image(); img_b[3].src = "sm.gif" } function B_in(nam,num){ if(NN3 || NN4 || IE4) document.images[nam].src = img_b[num].src; } function B_out(nam,num){ if(NN3 || NN4 || IE4) document.images[nam].src = img_b[num].src; return false; } // END ---> </SCRIPT> </head> -----ここからbody <BODY onLoad="time(0)"> <SCRIPT LANGUAGE="JavaScript"> <!--- ここから表示 document.write(TodayIMG(0)); //end ---> </SCRIPT>

  • 時間によって表示される画像を替えたい

    はじめまして。 私は自分のお店(お菓子のお店)ホームページをつくってます。 時間、曜日によって<open>、<close>の二枚の画像を入れ替えたいのですが上手くいきません。 オープン時間は12:00-19:30で、定休は水曜なので自分なりに書いてみたのですがダメでした。12-19時なら稼働したのですが30分が入ってくるとごっちゃなってしまいます。そうこうしているうちに文自体ごっちゃです。すみませんお助けねがえないでしょうか?? 宜しくお願い致します。 <script language="JavaScript"><!-- d = (new Date()).getDay(); h = (new Date()).getHours(); m = (new Date()).getMinutes(); if (d == 3) Discg = "tokei/close.png"; else if ((h > 0) && (h < 12)) Discg = "tokei/close.png"; else if ((h > 12) && (h < 19)) Discg = "tokei/open.png"; {document.write("<IMG src='" + Discg + "' border='0'>");} </script>

  • タグが閉じてないというエラーについて

    タグチェックをすると、下記のようなコメントが出ます。 "<!--" が現れたのに "-->" が最後まで現れなかったときの警告です。コメントを入れ子にしたりして、どこか間違えたのでしょう。 ・下記のスクリプトは、フリーのスクリプトをもらってきたものです。 タグは閉じられてるはずなのに、何故このようなメッセージが出るのでしょう? どこがいけないのか教えてください。 <SCRIPT type="text/javascript"> <!-- xx = escape(document.referrer); yy = ""; for (i = 0; i < xx.length; i++) { zz = xx.charAt(i); yy += (zz == "+") ? "%2B" : zz; } document.write('<IMG WIDTH=84 HEIGHT=16 '); document.write('SRC="./count.cgi'); document.write('?gif+ref+', yy, '">'); //--><IMG WIDTH=84 HEIGHT=16 SRC="./count.cgi?gif" ALT="counter" ALIGN=BOTTOM> </SCRIPT>