ロードされて開始、マウスオーバーで停止
① 画像取得、② 画像のソース(ファイル名)を変える(+1 して最後までいったら戻る)、③ ②を繰り返す、④ そして③をいつ始めいつ終わらせるかを決める。ということならば、画像ファイルとその数、HTML要素、時間の間隔、どのように始まりどのように終わるかを引数にすればよいだろうか。このような感じで次が出来上がった。
|
以上ひとまず書いてはみたものの(H28年8月末)、使用して致命的な欠点に気付いた。
せっかく関数にしたにも関わらず、複数の要素に対して動作しない。
HTMLをあれこれ変えてみた結果、関数に原因があると結論した。自分の勉強が不十分なところは「タイマー」という変数だったのでそこに原因があるとすればどのような理由を考えることができるだろうか。複数の箇所でインターバルをおいて同名の関数が使われると、同名の変数も使われるがそれは問題がないだろうか。たぶんない。なぜならば { から } で閉じられた部分まで実施されて確かに変数に代入された値は変わるが、次の関数で適切な時に変数は初期化される。
”timer”は初期化されているのかな?これはsetInterval()を代入しているけれど、これは初期化とは違うだろうか?setInervalは一定の時間後一回仕事を行って、
timerに代入されるsetIntervalには”返り値”がある。それは文字列とか数値などの値ではなく、立派なオブジェクトである。
確かに代入後にtimer1;と書けば直ちに実行される。
問題はおそらくタイマーの配列を宣言して、連想配列を使えば解決しそうに思われる。
配列は文字列なのか配列なのか明らかでない関数などを受けてくれるのだろうかという不安もあったが実際には動いていただけたようだ。
下記のblinking要素はマウスオーバーでそれぞれ停止する。
|
しかしそれでは満足できないことが生まれてしまった。この関数はロードされたタイミングでしか開始できないことである。
setIntervalとclearIntervalを意のままに発火させたいならばどうする?オライリーには何と書いてあるのか。そもそもイベントとはなんなのか。
初心者というものはたいていこういうものではないだろうか。押したら動いた、うれしいな。しかしどうしてこういう書き方なのかな?難しいな。と
しかし塩漬け期間を経てから再度こうやって学習すると理解に至る。うれしいものじゃないか。
イベントは要素タグの中に
onclick=""
またある時はプロパティとして
myImg.onclick = …;
この二つはプロパティの記述法に似ている。どちらかを理解すれば両方理解したことになる。
ところがイベントリスナはその書き方が特異的なだけでなく、同一要素に複数のイベントを指定できるという機能を持っている。
これで意のままに発火できるということになる。2016年10月3日この実験終了。
0:0:0 |
OFF |
ON-OFFにカーソルを乗せると動作するタイマー。厳密なタイマーではない。プログラムを動かす時間が加算される、それに加えて…
|
|
左からマウスオーバー、クリック、マウスオーバー、ダブルクリックで開始/停止
結局見た目とてもシンプル。2016年10月4日BLINKINGの章