任意の秒数から0秒までカウントダウンするタイマーです。
最終的には時間指定をするボタンを組み込みます。
<html> <head> <title>キッチンタイマー</title> </head> <body> <h3>キッチンタイマー</h3> <hr> </body> </html> |
メモ帳などテキストエディタに基本のHTMLを記入します。 |
<html>
<head>
<title>キッチンタイマー</title>
</head>
<body>
<h3>キッチンタイマー</h3>
<hr>
<form name="ktimer">
<input type="text" name="counter" size="10">
<input type="button" name="b_start" size="10" value="スタート"> |
タイマーのカウントを表示するテキストフィールドとスタートボタンをフォームに置きます。 フォーム、テキストフィールド、ボタンにはそれぞれ名前を付けておきます。 |
(省略) </form> <script type="text/javascript"> //初期設定 def_count = 60; document.ktimer.counter.value = def_count; function count_start() { //カウント開始 count = document.ktimer.counter.value; timerID = setInterval('countdown()',1000); } function countdown() { //カウント表示 count--; document.ktimer.counter.value = count; } </script> </body> </html> |
まず、初期設定において、標準値として変数def_countで最初の表示秒数を決定します。 ユーザー関数count_startには、スタートボタンを押した後の動きを記述します。 timerIDは変数で、タイマーが起動したときに割り当てられる数値が入っています。 ユーザー関数countdownでは、変数countを1減らしてフォームに表示します。 |
<form name="ktimer">
<input type="text" name="counter" size="10">
<input type="button" name="b_start" size="10" value="スタート" onClick="count_start()">
</form>
スタートボタンにonClickでユーザー関数count_startを呼び出して、カウントダウンを開始します。
(省略)
function countdown() {
//カウント表示
count--;
document.ktimer.counter.value = count;
if (count <= 0) {
count_stop();
}
}
function count_stop() {
//カウント停止
clearInterval(timerID);
}
(省略) |
この時点ではカウントは停止しませんので、ユーザー関数countdownにおいて、変数countが0以下になったらタイマーを止めることにします。 ユーザー関数countdownにif文を追加します。 実際にこの時点では、スタートボタンを押すと複数のタイマーが起動するため、タイマーは0でも止まらなくなります。 ユーザー関数count_stopではclearInterval命令でタイマーを止めています。 現時点では複数のタイマーを起動すると正常に動作しません。 |
(省略) //初期設定 def_count = 60; timer_reset(); function timer_reset() { //タイマーの初期化 document.ktimer.counter.value = def_count; } function count_stop() { //カウント停止 clearInterval(timerID); timer_reset(); } (省略) |
カウントが0で止まった後、そのままにするよりも最初の状態に戻した方が良いでしょう。 ユーザー関数timer_reset()を作って、その中に初期設定からフォームに関数def_countを設定する一行を移動します。 初期設定の最後でユーザー関数timer_resetを呼び出します。 タイマーのテストをする時は、関数def_countの値を小さくするなどして、テストの時間を短くしましょう。 ユーザー関数count_stopには、タイマー停止の次に、ユーザー関数timer_resetの呼び出しを行います。これで、タイマーの初期化ができます。 |
(省略)
function timer_reset() {
//タイマーの初期化
document.ktimer.counter.value = def_count;
document.ktimer.b_start.disabled = false;
}
function count_start() {
//カウント開始
count = document.ktimer.counter.value;
document.ktimer.b_start.disabled = true;
timerID = setInterval('countdown()',1000);
}
(省略) |
現時点では、スタートボタンを押すと、その数だけタイマーが起動し、同時にカウントダウンを行います。 まずは、ユーザー関数count_startで、ボタンを使用禁止にします。使用禁止はプロパティdisabledに対してtrueの値を入れてやると設定されます。 次に、ユーザーtimer_reset内で禁止の解除を行います。 ボタンの使用禁止解除は、ユーザー関数count_stop内に記述しても良いのですが、更新ボタンが押されるようなことがあると、ブラウザによってはボタンが使えなくなることがあるため、初期設定後に必ず実行される位置に置くことにします。 |
<form name="ktimer">
<input type="text" name="counter" size="10">
<input type="button" name="b_start" size="10" value="スタート" onClick="count_start()">
<input type="button" name="b_reset" size="10" value="リセット" onClick="count_stop()">
</form>
カウントが終了するとタイマーが自動的に初期化されますが、ボタンでいつもで初期化(リセット)できるようにしましょう。
フォームにリセットボタンを足します。onClickからユーザー関数count_stopを呼び出せばタイマーを停止して、初期化が実行されます。
<form name="ktimer">
<input type="text" name="counter" size="10">
<input type="button" name="b_start" size="10" value="スタート" onClick="count_start()">
<input type="button" name="b_reset" size="10" value="リセット" onClick="count_stop()">
<input type="button" size="10" value="3分" onClick="set_timer(180)">
<input type="button" size="10" value="5分" onClick="set_timer(300)">
</form>
任意の数字をテキストフィールドに入力すると、そこからカウントダウンが始まります。
しかし、よく使われる時間についてはその手間を省くことも重要です。
そこで、ボタンを押すと自動的にカウントがセットされて、タイマーが起動するようにしましょう。
まずは、フォームに2つのボタンを設置します。name属性はなくても良いでしょう。表示は3分と5分ですが、秒数では180秒と300秒です。
onClickからユーザー関数set_timerを呼び出し、同時に秒数を値として渡します。
(省略) function set_timer(num) { //規定時間の設定 document.ktimer.counter.value = num; count_start(); } (省略) |
ユーザー関数set_timerでは、関数numで値を受け取ります。 受け取った値はフォームに表示し、ユーザー関数count_startを実行してカウントを始めます。 |
(省略)
function timer_reset() {
//タイマーの初期化
timerID = 0;
document.ktimer.counter.value = def_count;
document.ktimer.b_start.disabled = false;
}
function set_timer(num) {
//規定時間の設定
if (timerID > 0) {
count_stop();
}
document.ktimer.counter.value = num;
count_start();
}
(省略) |
このままでは、規定時間のボタンを何度も押すことができますので、ここでもタイマーの二重起動の対策が必要です。 まずは、ユーザー関数timer_resetの中で変数timerIDの初期値を0とします。これがタイマーが動いてない状態となります。 次に、ユーザー関数set_timerでタイマーが起動しているとき、すなわち変数timerIDが0より大きいときにユーザー関数count_stopを呼び出してタイマーを止めます。 ユーザー関数set_timerにおいて、変数timerIDをif文で調べるため、それ以前に初期値を設定しておかないとエラーが発生します。 |
(省略)
function countdown() {
//カウント表示
count--;
document.ktimer.counter.value = count_format(count);
if (count <= 0) {
count_stop();
}
}
function count_format(num) {
//カウント表示の書式設定
var tm,ts;
tm = Math.floor(num / 60); //分
ts = num % 60; //秒
return tm + ":" + ts;
}
(省略) |
カウントの表示を秒だけの表示から、分と秒の表示に変更します。 表示の書式をユーザー変数で処理しましょう。 ユーザー関数count_formatを記述し、秒数を受け取るため、変数numを用意します。 ローカル宣言された変数をローカル変数と言います。 計算式にある「%」は、割り算した余りを計算するという意味です。 ユーザー関数からの戻り値がどこに戻るかというと、呼び出した位置になります。 ユーザー関数countdownの中で変数countを出力していますので、その時点で書式を整えて表示を行います。 |
(省略)
function count_format(num) {
//カウント表示の書式設定
var tm,ts;
tm = Math.floor(num / 60); //分
ts = num % 60; //秒
if (ts < 10) ts = "0" + ts;
return tm + ":" + ts;
}
(省略) |
さて、このままでは1つ問題が発生します。 if文を入れて、変数tsが10より小さいとき、変数tsの頭に文字列の「0」を付け足す式を記述します。 「"」で囲われた部分は文字列の意味を持つため、例え数字であっても文字列となります。 変数に入っているのが数値か文字列かは、自動的に式の中で判別されます。 |
<form name="ktimer" onSubmit="return false;">
<input type="text" name="counter" size="10">
<input type="button" name="b_start" size="10" value="スタート" onClick="count_start()">
<input type="button" name="b_reset" size="10" value="リセット" onClick="count_stop()">
<input type="button" size="10" value="3分" onClick="set_timer(180)">
<input type="button" size="10" value="5分" onClick="set_timer(300)">
</form>
フォーム内に送信ボタンはありませんが、テキストフィールド内にカーソルがある場合にエンターキーを押すとフォームが送信されてしまいます。
送信先は指定されていませんので、このHTMLファイルに対してフォームが送信されます。そうすると再読込(更新)と同じでまたフォームの内容が初期化されてしまいます。
そこで、そのような誤送信を防ぐため、<form>タグに送信時に処理を中断させる記述をします。
onSubmitが送信のイベントが発生した場合の処理です。内容はfalseを返信することで、処理を中止させるのです。
規定時間のボタンは自由に増やすことができます。
また、全体的にレイアウトを整えて、使いやすくしたいところです。