Step.9 - 1文字ずつ表示するメッセージ


キーボードから入力するような感覚で、メッセージを左から1文字ずつ表示していきます。


Step テーマ
● substring (文字列の切り取り)
● length (文字列の長さの取得)

実行例




リスト


<script type="text/javascript"><!--
myMsg = "いらっしゃいませ こんにちは!";
myCnt = 0;

function myFunc(){
     document.myForm.myFormMes.value = myMsg.substring( 0 , myCnt ) + "_";
     myCnt = ( myCnt == myMsg.length ) ? 0 : myCnt+1;
}
// --></SCRIPT>

<form name="myForm">
<input type="text" size="30" name="myFormMes">
</form>
<script type="text/javascript"><!--
setInterval("myFunc()",200);
// --></script>


サンプルだけの HTMLは こちらへ

説明


文字をタイプしているように表示させるには、次のような方法が考えられます。
・表示する文字列を用意する。
・まずは空白。
・左から1文字を取り出して表示。
・次に2文字取り出して表示。
・3文字…。
・全部表示したら最初からの繰り返し。
イメージができたらプログラムにしてみましょう。


文字列の入った変数に何文字入っているかを調べるには、length を使用します。
書式 は
result = 変数.length
です。

myMsg = "いらっしゃい";
myLength = myMsg.length;

であれば、myLength には 6 がセットされます。
※ 古臭いブラウザ NS4.0 は、12がセットされます。このバージョンでは文字数ではなく、文字コード数が返ってきます。NS4.5以降では6がセットされます。


次に、ここから ここまで の文字を取り出したいというときは substring() を使います。
どこから どこまで の文字を取り出すかの範囲を substring() のカッコ内に パラメータで指定します。
書式は
myString = 変数.substring( 開始位置 , 終了位置+1 )
となります。

開始位置は、文字列の先頭を ゼロから数えて 何番目の文字から取り出すかを指定します。
終了位置は、文字列の先頭をゼロから数えて 何番目の文字までを取り出すかを指定します。終了位置には指定した位置に 1を足します。
※ 要するに終了位置は先頭を1から数えた方がはやいですね。^^;

"こんにちは" の "ちは" を取り出したければ、
myMsg = "こんにちは" ;
myString = myMsg.substring( 3 , 5 );

となります。


では、やっと本題であるスクリプトの流れを説明します。(^^;

myMsg に、表示するメッセージをセットします。
myMsg = "いらっしゃいませ こんにちは!" ;

myCnt は、いま何個目の文字までを表示しているかのカウンターです。最初に、0 をセットしておいて、1文字表示するたびに、1 をカウントしていきます。
myCnt = 0 ;

では、function の中を説明します。

document.myForm.myFormMes.value = myMsg.substring( 0 , myCnt ) + "_";
表示は先頭から何文字抽出して表示するかなので、substring() の第1パラメータは いつも 0 番目(先頭から) です。
第2パラメータに myCnt を使います。

substring() の2つのパラメータが等しいときは "" (カラの文字列) が返ってきます。
myCnt は最初は 0 なので substring(0,0) は ""、 つまり、最初は空白イメージです。
それから1回表示するたびに、myCnt に 1 をカウントしていって 文字を取り出していきます。

myCnt = ( myCnt == myMsg.length ) ? 0 : myCnt + 1;
※ 三項演算子は Step.3 参照。
if 文で表現すれば、
if ( myCnt == myMsg.length ) myCnt = 0;
else myCnt = myCnt + 1;
と同じことです。

myCnt が、myMsg.length と等しいか? つまり、最後の文字まで表示していれば、myCnt に 0 をセット、つまり、先頭(空白) に戻します。
myCnt が、myMsg.length と等しくなければ、つまり、最後の文字まで表示していなければ、myCnt に 1 を加算、つまり、次の文字位置にカウンタを移動させます。


この関数を setInterval にて、0.2秒周期に過酷に呼んであげます。
setInterval ( "myFunc()" , 200 ) ;



リファレンス


● substring メソッド

Stringオブジェクト内の範囲で指定された文字列を返します。

【書式】
文字列変数.substring ( 開始位置 , 終了位置 )
"文字列リテラル".substring ( 開始位置 , 終了位置 )

【パラメータ】
開始位置 : ゼロから数えた開始文字位置
終了位置 : ゼロから数えた終了文字位置 + 1

開始位置もしくは終了位置が数値以外であれば、ゼロに置き換えられる。
substring(10 , 2) は substring(2 , 10) として処理する。

【戻り値】
範囲で指定された文字列
開始位置、終了位置が等しい場合は、null

リファレンス


● length プロパティ (String)

Stringオブジェクトの文字長を返します。

【書式】
文字列変数.length
"文字列リテラル".length