2-1-2.typeend()関数
では実際に関数の中身を見ていきましょう。先ほどの流れの順に解説していきますので、
実際に実行する順番とは異なる事に注意してください。
まずはタイピングが終了した時に実行する関数typeenda()です。
function typeend(){
clearInterval(time); //時間を止める関数を呼び出す
restart=0; //restart変数を0に変更
endflag=1; //endflagを1に変更
kekka(); //kekka()関数を呼び出す
cookief(); //cookief()関数を呼び出す
emptyend(); //emptyend()関数を呼び出す
}
順に追っていきましょう。
まずはtypeend()関数が呼び出すのはタイピングが終了した時なので、終了時の処理を
記述しています。
まず最初に呼び出されるのがJavaScriptですでに定義してある関数clearInterval()関数です。
この関数はJavaScriptですでに定義されているsetInterval()関数と対になっておりsetInterval()
関数で指定された時間毎にカウントされる時間を止めるためのものです。
clearInterval(time)の引数はsetInterval()関数で指定した名前を当てはめます。
こうすることでtimeで指定されている時間のカウントが止まることになります。
(注:名前を変えることでいくつか時間をカウントすることができますが、何個も作成すると
動作が不安定になるみたいです。)
次にrestart=0についてですが、これはENTERキーでタイピングをスタートする時に、
今現在タイピングがスタートしているかどうか?を判定するものです。
タイピングがスタートしていれば1、スタートしていなければ0とし、
このtypeend()関数内ではタイピングが終了した時に実行するのでスタートしていない
状態0に変更しています。
次のendflag=1;はタイピングが終了しているかどうかを判定するもので、0が終了していない、
1が終了として使用しています。
これは先ほど記述のrestart変数があれば特に必要がないかもしれません。
適宜スクリプトを変更してみてください。
次は
kekka();
cookief();
emptyend();
のそれぞれの関数呼び出しについて述べますが、ここではただ関数を呼び出しているだけです。
中身についてはのちほど出てきます。
typeend()関数はタイピング終了時に呼び出されるので、終了時にしなければならない処理、
結果をテキストフィールドに出力(kekka()関数)
結果をクッキーに書き込みなど(cookief()関数)
テキストフィールどに終了した事を知らせる文字列の出力(emptyend()関数)
を行っています。これでtypeend()関数で実行している処理が終了するので、typeend()関数を
呼び出した場所へ戻る事になります。
2-1-3.kekka()関数
さて次は結果をテキストフィールドに出力する関数kekka()です。
function kekka(){
document.text.seikai.value=seikaisuu; //テキストフィールドに正解数を入れる
document.text.machigai.value=machigaisuu; //テキストフィールドに失敗数を入れる
document.text.parsent.value=parsent; //テキストフィールドに正解率を入れる
document.text.sokudo.value=sokudo; //テキストフィールドにタイプ速度を入れる
tokuten=sokudo*100+seikaisuu*2+parsent*5; //得点を算出
tokuten=String(tokuten); //得点を文字列として扱う
tokutentmpichi=tokuten.indexOf(".",0); //得点で最初に.(ピリオド)がくる場所を探す
tokutentmp=""; //得点の仮の値として使う変数を初期化
for(a=0;a<=tokutentmpichi+3;a++){ //得点を小数点以下3位までに切り詰める処理
tokutentmp=tokutentmp+tokuten.charAt(a);
}
tokuten=Number(tokutentmp); //作った得点値を文字列から数値に変換
document.text.tokuten.value=tokuten; //テキストフィールドに得点を入れる
}
kekka()関数は基本的に得点をテキストフィールドに入れるだけの処理でかまわないんですが、
なぜ正解数などもテキストフィールドに入れなおしているかと言うと、タイピングが終了してから
変数の値とテキストフィールドの値がずれてしまうのを避ける為です。
実際にこの処理を入れても多少はずれてしまいますが・・・。
さてそれでは中身について見ていきましょう。
まず最初に
document.text.seikai.value=seikaisuu;
document.text.machigai.value=machigaisuu;
document.text.parsent.value=parsent;
document.text.sokudo.value=sokudo;
というほとんど同じような記述があります。これはHTMLタグの説明の講座で作成した
テキストフィールドに正解数などを表す変数を入れています。
たとえばHTMLタグでフォームの名前をdef、テキストフィールドの名前をabcという名前で作っていた時、
そのテキストにseikaisuu(正解数)の値を入れたい場合は
<form name="def">
<input type="text"name="abc"size="20"onFocus="this.blur()">
</form>
<script language="JavaScript">
<!--
document.def.abc.value=seikaisuu;
-->
</script>
とすれば値をテキストフィールドに入れることができます。
tokuten=sokudo*100+seikaisuu*2+parsent*5;
さて次にtokuten(得点)を独自の得点法によって算出してます。これは自由に得点方法を
考えて見てください。
次に得点ができたのになぜそのまま得点をテキストフィールドに入れていないのか?
それは得点が小数点以下何桁にもわたり続いているからです。
これでは得点結果が見づらいので小数点以下3桁までに切り詰める処理を入れます。
それをしているのが以下の処理です。
tokuten=String(tokuten);
tokutentmpichi=tokuten.indexOf(".",0);
tokutentmp="";
for(a=0;a<=tokutentmpichi+3;a++){
tokutentmp=tokutentmp+tokuten.charAt(a);
}
tokuten=Number(tokutentmp);
document.text.tokuten.value=tokuten;
まず最初に行っているのが数値データであるtokuten(得点)を文字列に変換しています。
文字列への変換はJavaScriptですでに定義されている関数String()で変換できます。
なぜここで数値を文字列として扱うかと言うと、小数点以下3桁までにしたいのですが、
数値データであると文字列として操作できない為で最初から何番目の数値なのか?
という事ができない為です。
次に行っているのがtokuten(得点文字列)の中で.(ピリオド)が最初に見つかった位置を
変数に入れています。
この処理はピリオドが見つかった位置から3文字後までを得点とする為にピリオドの位置を
変数に代入しておきあとで使用する為です。
文字列の検索にはindexOf()関数というJavaScriptですでに定義されている関数を使用します。
たとえばtextという文字列を表す変数から最初にaという文字が見つかった位置を調べたいとします。
それは
text.indexOf("a",0);
で検索することができます。ここで0の値は0番目の位置(文字列の一番最初)から検索すると
言う意味で、1にすると2番目の文字からの検索になります。
ここでtext変数に『decaid』という文字列が入ってたとすると、結果は3になります。
さて、これで小数点の位置がわかったので得点を小数点以下3桁まで切り詰めます。
for文を使って、最初の文字から小数点までの位置+3まで繰り返して得点の作成を
しています。
tokutentmp=tokutentmp+tokuten.charAt(a);
上のスクリプトでcharAt(a)というのが出てきてますが、これは文字列のa番目の文字を
取り出すことができる関数です。
これを文字列から数値に変換して(文字列から数値への変換はNumber()関数でできます)
それを得点のテキストフィールドに代入してます。