setTimeout内での現在の時間を知るには?

[上に] [前に] [次に]
ゆっちー 1999/09/06(月) 15:52:42
JavaScriptで
setTimeout('hoge()',5000)//5000msec=5秒
などとした場合に、
今、その5秒のうち何秒経ったのかを取ることってできるのでしょうか?
どうか、教えて下さい

Nobu3 [E-Mail] [HomePage] 1999/09/06(月) 17:57:04
少なくとも直接取得するのは無理だと思います。

どんな事を考えているんですか?
制限時間を表示するとかなら、
「1秒毎にチェックして、5秒を超えたらそのスクリプトを実行する。」
ようにやってはどうでしょう?

ゆっちー 1999/09/06(月) 19:25:58
function hoge(){setTimeout('hoge()',5000);
命令}

とかってhoge()をループをさせてるのを
一旦止めて、命令に使う値を入れ直しさせて
またhoge()を実行させたいのですが、
その時に、setTimeoutの時間とずれがないようにしたいのです。
って解りにくいですね。

Nobu3 [E-Mail] [HomePage] 1999/09/07(火) 01:03:51
なるほど。

で、その割り込み処理はそんなに時間を食うのでしょうか?
それとも、0.1秒でも、狂ってはまずいのでしょうか・・・。
普通の使い方だと思いますけど・・・?

正直言って見せてもらうのが一番早いです。
なんのためにそれをするのか、よくわからないので・・・。

ふじ 1999/09/07(火) 01:27:38
突っ込みですが>本題から逸れて済みません。

>function hoge(){setTimeout('hoge()',5000);
>命令}
こういう、意味の無い(?)再帰呼び出しは避けた方が無難かと。
1時間放っておくと、720回呼び出されてスタックがどんどん深くなって・・・
#危ない気がします。

Nobu3 [E-Mail] [HomePage] 1999/09/07(火) 02:35:17
ますます逸れますが、チョット気になっている事なので。

これは、clearTimeout()で処理すれば大丈夫なのではないでしょうか?

var hogeTimer;
function hoge(){
clearTimeout(hogeTimer);
・・・命令・・・
hogeTimer=setTimeout('hoge()',5000);
}

それとも、これって無駄なんでしょうか?

ふじ 1999/09/07(火) 04:02:04
>それとも、これって無駄なんでしょうか?
ブラウザの実装依存になる気がするので迂闊なことは言えないですが・・・
clearTimeout するなら問題ないような気もします。
#実験してないので信用しないでね(^^;;

しかし、setTimeout を再帰呼び出しにする必要性って(少なくとも一定時間ごとに呼び出す場合)
ありますかね。
一度 setTimeout をセットしたら clearTimeout されるまで一定時間ごとに呼び出してくれるものだし・・・

Tmb 1999/09/07(火) 09:39:49
僕も以前間違えて回答してたんですが,setTimeoutの方は一回のみの
呼び出しになるものです。
#時間ごとの呼び出しはsetInterval。だけど古いバージョンでは未対応
#実行するのも古いバージョンでは,厳密には関数を呼び出すのではなく
#表現式(っていうんだっけ? evalの中身みたいなものって)になる。

ゆっちー 1999/09/07(火) 10:14:39
<IMG SRC="img/break.gif" NAME="movi" width="200" HEIGHT="150">
<SCRIPT language="JavaScript">
<!----------------
a=1;
var movstop=0
jpg="";
angle="over/"
ca=1;
function movplay() {
       movstop =   setTimeout('movplay()', 5000); // 1000msec = 1sec
if (a <100)  { jpg =angle+ "test"+a+".jpg";
                     }else{
jpg = "img/break.gif";
stop();}
saki=new Image(200,150);//イメージ先読み
saki.src=angle+"test"+(a+1)+".jpg";
         document.movi.src =jpg;
a++;
                        }
function stop(){clearTimeout(movstop)  ; }
function camera(n){
if(n!=ca){
ca=n;
stop();
saki=new Image(200,150)
saki.src=who+angle+"test"+(a+1)+".jpg"
setTimeout('movplay()',2500);
}else{false;}}
movplay();
//----------->
</script>

長くなってすいません。
上記のようなスクリプトで
5秒ごとにイメージ(name="movi")の書き換えをしていて
ボタンをクリックすると「東京」「名古屋」「福岡」と
カメラが切り替わるように見せたいのですが、
カメラを切り替えた時に時間がずれてしまうのがいやなのです。
今は、とりあえず、2500msecのタイムアウト(camera())を入れているのですが
それを(5000-経過時間)にしたいのですが何かいい方法はないでしょうか?

Tmb 1999/09/07(火) 10:48:13
ミリ秒単位のずれが出てもいいのなら・・・
1. movplay()のsetTimeoutを実行した直後に現在の時刻を取得(hoge=new Date;)
2. camera()のsetTimeoutを実行する前に現在の時刻を取得(fuga=new Date;)
3. camera()のsetTimeoutの2番目の引数を5000-(fuga.getTime()-hoge.getTime())とする

とりあえずこんなところではどうでしょう?
#setTimeやらブラウザによってはgetMillisecondなんかを使えば,もっときれいなスクリプトに
#仕上げられるでしょうけど。

Tmb 1999/09/07(火) 10:49:15
おっと
>=new Date;
=new Date(); の誤りです。

Tmb 1999/09/07(火) 11:16:13
えーっと,一旦回答してながらなんですが,じっくり見せていただきましたが,
cameraの処理はこうする必要があるんですか?

先読みする画像と画像ファイル名を表す変数を書き換えさえすれば,別に
movplay()を止めたり,実行したりさせなくてもいいのでは?
#全体のアルゴリズム自体を見直すということで。

このスクリプトだとwhoが生きてないですよね? 他にそれを指定してるところが
ないので憶測ですが,最終的にはこれにディレクトリを表す文字列を入れて,画像
を変えるつもりなのではないですか?
それなら単にcameraではwhoを書き換え,次の画像を先読み(これもいっそ
グローバルにしては?)するだけでよいのではないかと思いますが。

とりあえず今のスクリプトでcamera()からstop()とsetTimeoutの行を抜いて
何か問題がありますか?

ゆっちー 1999/09/07(火) 14:14:31
[[解決]]
すいません。
camera()の処理はangleの書き換えだけでいいですね。
リンクボタン内でスクリプト書き換えをしようと
捕らわれてしまった結果、変なことになってしまいました。

whoに関しては、ここに、少しでも簡潔に書こうと思い
消したつもりだったのですが、消し忘れました。

あと、5000-(fuga.getTime()-hoge.getTime())
のも勉強になりました。
ありがとうございました。

[上に] [前に] [次に]