• 締切済み

substringとlengthの連携コード

Smessage = Smessage.substring(2,Smessage.length) + Smessage.substring(0,2);の部分ですが、動きがイマイチわからないです。 substringで配列2つ目(= S2)とlengthで持ってきた値=4(だがsubstringの終了インデックスはその前の数字を考えるので3つ目= S3)を抜き出し、2つ目のsubstringで配列0番目(= S1)=と2番目(= S3)を抜き出し、 結果S2とS4 + S1とS3をSmessageに代入しているんですか? 順番としてはS2が最初に来て次にS4、 S1最後にS3が来るのではないんですか? でも実行結果はS1、S2、S3、S4と順番通りになっています。この辺が良くわかりません。 <!DOCTYPE HTML> <html><head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <title></title> <script type="text/javascript"> <!-- var TC = 0 ; var S1 = "1つ目の空白 "; var S2 = "2つ目の空白 "; var S3 = "3つ目の空白 "; var S4 = "ここにメッセージ......。"; var Smessage = S1+S2+S3+S4; var timeID=setTimeout("",1) ; function Message() { if (TC < 1000) { TC++ ; window.status = Smessage; Smessage = Smessage.substring(2,Smessage.length) + Smessage.substring(0,2); clearTimeout(timeID) timeID = setTimeout("Message()",300); } else { window.status = " " } } //--> </script> <style type="text/css"> <!-- body { background-color: #AFEEEE; } --> </style> </head> <body onLoad="Message()"> ★ステータス行に文字を流してます </body></html>

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> Smessage.substring(2,Smessage.length) の()内は2と1つ目の空白 からここにメッセージを数えた文字数が入るのでしょうか?  > 次のsubstring(0,2)は0番目から2番目の文字なので、「1・つ・目」の3文字? これくらいは、自分で調べましょう。 ・マニュアルや解説サイトを探して、読む。 ・alertやデバッガを使って確認する。 など。 例えば上のプログラムの該当個所周辺を window.status = Smessage; // デバグ用 alert(Smessage); alert(Smessage.length); alert(Smessage.substring(2,Smessage.length)) ; alert(Smessage.substring(0,2)); // Smessage = Smessage.substring(2,Smessage.length) + Smessage.substring(0,2); // デバグ用 alert(Smessage); // とでもすれば、その2つの質問への答えになるはずです。

KAIJI-000
質問者

補足

返事が遅れました。 変数の文字列を同じにして考えていたのがバカでした。 var Sm1 = "01つMe"; var Sm2 = "2tsu目"; var Sm3 = "3津メ"; var Sm4 = "ここにメッセージを入れます......。"; とし、 さらに Smess = Smess.substring(2,4) + Smess.substring(0,2); とし、時間もtimeID = setTimeout("Mess()",5000); のようにゆっくりにしてalertで試してみるべきでした。 検証不足は申し訳ないです。 ただそれでもすいません。まだ、仕組みが解ってません。 なぜ文字がずれているのですか? substiringは完全に取り除くと言うイメージですか? 1回目のアラートで つM01 これはわかります。 でも2回目のアラート 01つM になぜなるのかわかりません. それとlengthが間に入っているのがややこしいです。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> substringで配列2つ目(= S2) からして間違いです。 var Smessage = S1+S2+S3+S4; はS1とS2とS3とS4を連結して一つの文字列にするもの。 var S1 = "1つ目の空白 "; var S2 = "2つ目の空白 "; var S3 = "3つ目の空白 "; var S4 = "ここにメッセージ......。"; だから var Smessage = "1つ目の空白 2つ目の空白 3つ目の空白 ここにメッセージ......。"; になる。 Smessageは配列ではない。 文字列.substringは、文字列の一部を切り出して、新しい文字列にするもの。 マニュアルなどに書いてある「インデックス」は「何文字目」というのとほぼ同義。 「インデックス0番目の文字」=「一文字目」

KAIJI-000
質問者

補足

こちらへの回答も有難うございます。 Smessage.substring(2,Smessage.length) の()内は2と1つ目の空白 からここにメッセージを数えた文字数が入るのでしょうか? 次のsubstring(0,2)は0番目から2番目の文字なので、「1・つ・目」の3文字?

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

今、試せる環境に無いのですが。 Smessageに”ABCDEF”でも代入し、Alartで Smessage.substring(2,Smessage.length) + Smessage.substring(0,2); を表示するだけのプログラム書いてみるとかしたほうが 結局早くないですか?

KAIJI-000
質問者

補足

ご提案有難うございます。ただ質問としてはコードについてかみ砕いた解説をお願いしたいです。

関連するQ&A

  • タイプライター風 part2

    以前、pesoさん、xruzさんに教えられたこと等をもとに 以下のようなscriptを作成しました。 /////// <head> <script language="javascript"> <!-- str1="わしはしばらく出てこないよーーー "; str2="しばらく出てこないよーーー "; str3="出てこないってばーーー "; blnk = "          "; str = str1+blnk; cnt=0; mcnt = 0; msg = ""; stcnt=0; i=0; timeID = 10; function type(){ if(i<=str.length){ if(document.all){ stcnt++; if (stcnt>3){ stcnt = 0; msg += str.substring(mcnt,mcnt+1); mcnt++; if (mcnt >= str.length) { mcnt=0; msg=""; } } csr = " "; if (stcnt & 1) csr ="_"; myText.innerHTML=msg+csr; } else if(document.layers) { document.myText.document.open(); document.myText.document.write(msg.substring(0,i)); document.myText.document.close(); } i=++i; clearTimeout(timeID); timeID=setTimeout("type()",50); } else{ i=0; clearTimeout(timeID); timeID=setTimeout("type()",50); } } //--> </script> </head> <body bgcolor="#cccccc" onload="type()"> <div id="myText" style="position:absolute;top:20;left:20;"></div> </body> pesoさん、xruzさん、ありがとうございました。これでほぼ、僕の作りたい スクリプトができました。(不要なところもありますが......) ですが、このままだとstr1のみしか表示されず、str2、str3は表示され ません。(当然ですが) str1を表示した後にstrにstr2、str3を入れるにはどうしたらいいので しょうか?(以前、xruzさんに教えていただいたスクリプトを永遠に 続けるような感じです。)

  • javaスクリプトでリンク付のスクロールテキストを作成したいのですが、

    javaスクリプトでリンク付のスクロールテキストを作成したいのですが、困っております。 参考サイトを探し、下記の状態まで作成しております。 <html> <head> <script language="JavaScript"> <!----- var msg = "テキスト"; msg = msg + "     "; msg = msg + "テキス2"; msg = msg + "     "; var speed = 200; function textDisp(){ msg = msg.substring(1,msg.length) + msg.substring(0,1); document.form1.text1.value = msg; setTimeout("textDisp()",speed); } var winTarget = "_self"; var url = "http://www.yahoo.co.jp/"; function textlink(){ open(url, winTarget); } //-----> </script> </head> <body bgcolor="white" onLoad="textDisp();"> <form name="form1"> <input type="text" name="text1" size="60" onclick="textlink();" style="cursor:hand;border:none;color:#ff3399;" onMouseover="this.style.color='#ffcc00'" onMouseout="this.style.color='#ff3399'"> </form> </body> </html> 表示時に”テキスト”と”テキスト2”を独立してそれぞれ、違うリンク先に飛ばすには どのようにすればよろしいでしょうか? また、空白をのぞき、リンク部分だけに下線をつけたいです。 CSSで指定をすると文字から空白まですべてに下線が付いてしまいます。 説明が悪いかもしれませんが、もしお分かりになる方おられましたら、参考サイトでも かまいませんのでお教えいただけますと幸いです。

  • JavaScriptの文字表示速度

    こんにちは。 JavaScriptの事でお聞きしたい事があります。 まではこれを見てください。 <SCRIPT language="JavaScript"> <!-- msg = "ここにメッセージを入力すると、途中から少しだけ早くなる"; stcnt = 0; wid =60; blnk = ""; for(i=0; i<wid; i++) blnk += " "; str = blnk + msg ; timeID = 10; function scroller() { document.guide.message.value = str.substring(stcnt++,stcnt+wid); if (stcnt>msg.length + wid) stcnt=0; clearTimeout(timeID); timeID = window.setTimeout("scroller()",100); } // --> </SCRIPT> -------------------- 文字を出したいところに <SCRIPT language="JavaScript"> <!----- document.write("<CENTER><FORM NAME='guide'>") document.write("<INPUT TYPE='text' NAME='message' SIZE=40></FORM></CENTER>") scroller(); // --> </SCRIPT> -------------- と張ります。 このスクリプトですが、htmlに張ると小さい文字表示の部分が出てきて 右から左にむかって文字が流れていきますが、途中から 文字の表示速度が速くなっています。 これてなぜか自分でもいろいろとやってみたのですが、いまいちよくわかりません。 説明をお願いできますでしょうか。 よろしくお願いします。

  • 入力した文字をステータスバーに流したい

    フォームに入力された文字をステータスバーに流したいのですがどうしてもわかりません。(動かさずに表示させることは出来ました。) <html> <body> <form method="post"> 文章を入力してください<br> <input type="text" size="30" onchange="a(this)"> </form> </body> </html> <script language="javascript"> function a(t){ tt=t.value; nagasa=tt.length; text=tt.substring(2,nagasa) + tt.substring(0,2); window.status=text; setTimeout("a('"+text+"')",1000); } 自分でも何かおかしいと思うのですがどうしても思いつけません。 わかる方教えてください。よろしくお願いします。

  • JavaScript初心者です。URLの末尾に含まれる文字列を名前にもつclassのstyleを変更したいです。

    JavaScript初心者です。 URLの末尾に含まれる文字列を名前にもつclassのstyleを変更したいんですが。。 URLに含まれる文字列を名前にもつidのスタイル変更については解決したのですが、同様のことclassでもやりたいと考えています。 例えばURLの末尾が /index.html?AAA&BBB となっている場合、非表示だったAAAとBBBのdivを表示するということをやりたいです。 ソースは以下になります。 前半でURLの末尾を取得して、後半でclassのスタイルを書き換えているつもりです。それぞれでは動作するんですが、あわせると動作しません。自分はかなり初心者ですので、根本的な誤りがあるかもしれませんが、ご教授よろしくお願いします。 <html> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>test</title> <style type="text/css"> <!-- .AAA,.BBB,.CCC { width:200px; background-color:#ccc; margin:10px; display:none; } --> </style> <script language=javascript> <!-- function changeStyle(){ var query = window.location.search.substring(1); var search = query.split("&"); for (var i = 0; i < search.length; i++) { var XXX = search[i]; } var allElement = document.getElementsByTagName('*'); for (var j = 0; j < allElement.length; j++) { if (allElement[j].className=='XXX') { allElement[j].style.display = "block"; } } } --> </script> </head> <body onload=changeStyle();> <div class="AAA">111</div> <div class="AAA">222</div> <div class="AAA">333</div> <div class="BBB">444</div> <div class="BBB">555</div> <div class="CCC">666</div> <div class="CCC">777</div> </body> </html>

  • ボタンを2回押さなければ・・・

    こんにちは 趣味でjavascriptをしている者です フラッシュ暗算のようなものを作りたくて、以下のようなコードを 作ってみましたが、ボタンを2回押さなければ、実行されません どこが間違っているのか教えていただけないでしょうか よろしくお願いします <html> <head> <script type="text/javascript"> function Timer() { this.timeID = null; } function init() { msTimer = new Timer(); timerA = new Timer(); } function hyouji() { document.Form1.box1.value = "おい!!"; } function hihyouji() { document.Form1.box1.value = ""; } function Shutudai() { clearTimeout(timerA.timeID); timerA.timeID = null; timerA.timeID = setTimeout( "hyouji()", 500 ); timerA.timeID = setTimeout( "hihyouji()", 500 ); } function GameBody() { msTimer.timeID = setInterval( "Shutudai()", 1020 ); } </script> </head> <body bgColor="efdcaa" onLoad="init()"> <form name="Form1"> <input type="text" name="box1" size="20"> <input type="button" value="開始" onClick="GameBody()"> </form> </body> </html>

  • JSの記述を別ファイルに移す

    下記のHTML内の <script type="text/javascript">~</script> をtest.jsとして別ファイルに移す場合にどのように、記述するればよいのでしょうか。単純にコピペしたのですがうまくいきません。 初歩的だとは思いますが、ご指導をお願いします。 --------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <link href="css/style.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="js/Draggable.js"></script> </head> <body> <div id="test1" class="test"></div> <div id="test2" class="test"></div> <script type="text/javascript"> var test1 = new Draggable("test1"); var test2 = new Draggable("test2"); </script> </body> </html>

  • このJavaScriptを外部ファイルにしたいのですが

    下記のjavascript部分を外部ファイルにしてすっきり させたいのですが方法がわかりません。 どなたかよろしくお願いします。 <head> <script type="text/javascript"> <!-- var txt = new Array(4); txt[0] = "ホームページへようこそ!!"; txt[1] = "4月になりました"; txt[2] = ""; txt[3] = "お車は駐車場へ入れましょう。"; var speed1 = 50; var speed2 = 300; var i = 1; var k = 0; var j = 0; var tID1,tID2; var nai; function txtScr(){ if(k >= txt.length){k = 0;} nai = txt[k].substring(0,i); document.formd.denkou.value = nai; i++; if(i > txt[k].length){ i = 0; k++; } if(i == 0){ clearTimeout(tID1); Scr(); }else{ tID1 = setTimeout("txtScr()",speed1); } } function Scr(){ document.formd.denkou.value = nai.substring(j,nai.length); j = j + 1; tID2 = setTimeout("Scr()",speed2); if(j > nai.length){ j = 0; clearTimeout(tID2); txtScr(); } } //--> </script> </head> <body onLoad="txtScr();"> <form name="formd" action="index.html" STYLE="margin: 4px;"> <noscript class="red"> JavaScriptの表示を有効にするか<br> JavaScript対応ブラウザで見てください。<br> </noscript> <input type="text" name="denkou" value="お知らせ" size="60%" tabindex="6" accesskey="f" style="background-color:#ccffcc;color:#333333;border:0px none #ffffff;font-size:22px;font-weight:bold;"> </form>

  • カーソル位置に文字を挿入

    カーソル位置に文字を挿入しようとしているのですが、どうもうまく行きません。 コードは以下なのですが、FireFox 等ではうまくいきますが、IE ではうまくいきません。どこが間違っているのでしょうか。よろしくお願いいたします。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head>  <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">  <title></title> <script type="text/javascript"> //@cc_on (function(){  document./*@if(1) attachEvent('on'+ @else@*/ addEventListener( /*@end@*/ 'click', function( evt ) {   var t = evt./*@if(1) srcElement @else@*/ target /*@end@*/;      if ( t.tagName == 'BUTTON' && /(^| )ContributionForm( |$)/.test( t.form.className ) ) {    var content = t.form.elements['content'];        /*@if(1)     var r = document.selection.createRange();     var c = r.duplicate();     c.moveToElementText(content);     c.setEndPoint('EndToEnd', r);     var pos = c.text.length;    @else@*/     var pos = content.selectionStart;    /*@end@*/    var moji_1 = content.value.substring( 0, pos );    var moji_2 = content.value.substring( pos, content.value.length );    content.value = moji_1 + t.value + moji_2;       }     }, false ); })(); </script> </head> <body>  <form action="#" class="ContributionForm" id="form" name="form">   <div>     <button type="button" value="test">ボタン</button>    <textarea name="content"></textarea>   </div>  </form> </body> </html>

  • setTimeout関数の使用方法について

    はじめまして。 質問があります。 以下のコードを実行すると、一定時間おきに文字の表示が変化する ように動いてくれません。何が問題なのかがまったく見当がつき ません。どなたかご指摘をお願いします。 ---------------------------------------------------------------- <html> <head> <title>setTimeout()関数の使用例</title> </head> <body onLoad="timer=setTimeout('changeChar()',500)"> <script type="text/javascript"> <!-- var str = "abcdefghijklmnopqrstuvwxyz0123456789"; var cnt = 0; function changeChar() { clearTimeout(timer); ch = str.charAt(cnt++); document.write(ch); if(str.length > cnt) { timer = setTimeout("changeChar()",500); } } //--> </script> </body> </html> ----------------------------------------------------------------

専門家に質問してみよう