やってみたJavaScript(0007): start/stopボタンを実装
やってみたJavaScript、今回はstart/stopボタンを実装するぞ!
割とチョチョイのチョイだ。見た目がショボいから。
test0007
https://www.hircos.work/test/test0007/
レイアウト
というほど何もないけど、canvasとbuttonを横に並べてみた。
あとついでに分かりやすいように背景色を一時的につけた。
body{
background-color: rgba(200, 200, 200, 1);
}
.canvas{
background-color: LightBlue;
float: left;
}
.button{
background-color: Yellow;
float: right;
}
#comment {
clear: both;
}
start/stopボタン
満を持してstart/stopボタンを実装。
<div class="button">
<button id="button_start">start</button>
<button id="button_stop">stop</button>
<button id="button_clear">clear</button>
</div>
見た目はとりあえず良しとして、まずは機能を優先ということで。
clearボタンはとりあえず置いといて、start/stopボタンが押されたときの実装はこんな感じにしてみた。
function pushStart( counter, cvs ){
console.log("pushStart:");
// avoid the double intervals
clearInterval( counter );
counter = setInterval( drawCanvas, TIME_INTERVAL, cvs );
}
function pushStop( counter ){
console.log("pushStop:");
clearInterval(counter);
}
startボタンを重複して押した場合でも大丈夫なようにpushStartにもclearIntervalを置いてみたが、ダメだった。
一回目のストップは止まる。が、再開以降ボタンが効かない。むしろstartボタンを押すたびにタイマが重複していくように見えますな……。
そもそもsetIntervalの戻り値は、タイマを識別できるIDだそうな。なので試しにsetとclearのIDを見てみる。
function pushStart( counter, cvs ){
console.log("pushStart:");
// avoid the double intervals
clearInterval( counter );
console.log("pushStart : clearInterval " + counter );
counter = setInterval( drawCanvas, TIME_INTERVAL, cvs );
console.log("pushStart : setInterval " + counter );
}
startボタンを押しまくった時のログ
pushStart : clearInterval 1
script.js:98 pushStart : setInterval 3
script.js:91 pushStart:
script.js:95 pushStart : clearInterval 1
script.js:98 pushStart : setInterval 4
script.js:91 pushStart:
script.js:95 pushStart : clearInterval 1
script.js:98 pushStart : setInterval 5
ということで、clearのほうはいつもID = 1、startのほうはIDがどんどんインクリメントしてるので、タイマがどんどん追加されてるのであった。なんでや!
さらに試しにwindow.onloadにcounterを表示するよう仕込んでみたら、まさにwindow読み込み時にしか実行されないじゃないですか。ここがループしてるのかと勝手に思ってたけど、確かにそうね。
ということで、counterをグローバルにして解決したのであった……。
clearボタンはまた今度ということで。