今回実験してみたストップウォッチ
(手元で実験すると別のタブを開いたらその間は計測されず、戻った時に再開する)
ググってみるといくつか書き方が見つかりましたが、解読するのにちょっと時間かかりそうだったので、setTimeoutで1秒ごとにコンソールにメッセージを出してみる を元に「分」と「秒」のストップウォッチを動かすコードを書き足して実験しました。
今回はこういう動作をするストップウォッチを作りたい
startボタンを押したら
- 1秒ごとにカウントアップする
- 60回実行されたら「分」に +1 する
- 「秒」を 0 に戻す
- カウントアップを続ける
stopボタンを押したら
- カウントアップを止める
resetボタンを押したら
- カウントアップを止める
- 「秒」と「分」を 0 に戻す
ボタンを押したときの動作を画面に書き込んでみると
ポイント
startボタンを押したら
setTimeout()の戻り値で「タイマーID」というものを取得して
stopやresetを押した時に
その「タイマーID」をclearTimeout(タイマーID)に渡してsetTimeout()を止める
コード.gs
function doGet() {
return HtmlService.createHtmlOutputFromFile("index");
}
|
意訳この機能がやること 指定したHTMLファイルを表示する |
index.html
<!DOCTYPE html>
<html>
<body>
<input type="text" id="tb" value="00:00">
<button id='start_bt'>start</button>
<button id='stop_bt'>stop</button>
<button id='reset_bt'>reset</button>
<script>
/************************************
グローバル
************************************/
var sec = 0;
var min = 0;
var timeOutId;
var ticking = false;
/************************************
イベント
************************************/
elem('start_bt').onclick = start;
elem('stop_bt').onclick = stop;
elem('reset_bt').onclick = reset;
/************************************
document.getElementById(id)でidの要素を返す
************************************/
function elem(id) {
return document.getElementById(id);
}
/************************************
start
************************************/
function start() {
if(ticking === true) {
//動いているときは何もしない
} else {
ticking = true;
setTimeout(timeout, 1000);
}
}
/************************************
stop
************************************/
function stop() {
ticking = false;
clearTimeout(timeOutId);
}
/************************************
reset
************************************/
function reset() {
ticking = false;
clearTimeout(timeOutId);
elem('tb').value = '00:00';
sec = 0;
min = 0;
}
/************************************
timeout
************************************/
function timeout() {
calcTime();
timeOutId = setTimeout(timeout, 1000);
}
/************************************
calcTime
************************************/
function calcTime() {
sec++;
if (sec === 60) {
sec = 0;
min++;
}
var time = add0(min, sec);
elem('tb').value = time.join(':');
}
/************************************
一桁の場合は頭に0をつけて二桁表示にする
************************************/
function add0(min, sec) {
if (min < 10) {
min = '0' + min;
}
if (sec < 10) {
sec = '0' + sec;
}
var time = [min, sec];
return time;
}
</script>
</body>
</html>
|
意訳時間を表示するテキストボックス スタートボタン ストップボタン リセットボタン 秒を0にする 分を0にする setTimeout() の返り値(タイマーのID)を入れる変数 時間が進んでいるかどうか start_btをクリックしたらstartを実行する stop_btをクリックしたらstopを実行する reset_btをクリックしたらresetを実行する この機能がやること 受け取ったidの要素を返す この機能がやること 時間が動いていたら 何もしない 止まっていたら tickingをtrueにして 1秒(1000ミリ秒)後にtimeoutを実行する この機能がやること tickingをfalseにして timeOutIdをクリアする この機能がやること tickingをfalseにして timeOutIdをクリアする テキストボックスに00:00を入れる 「秒」を0に戻す 「分」を0に戻す この機能がやること calcTime()を実行する timeOutIdにsetTimeout()の戻り値(タイマーのID)を入れる この機能がやること 「秒」をカウントアップする(+1する) もし「秒」が60なら 「秒」を0にして 「分」をカウントアップする 「分」と「秒」が一桁なら二桁にして テキストボックスに : でつなげて入れる この機能がやること もし「分」が10より小さかったら 頭に0をつけて もし「秒」が10より小さかったら 頭に0をつけて 「分」と「秒」を配列に入れて 返す |
関連記事
