2013-02-27 1 views
6

のフォーカスを失ったとき、誰かが特定のタスクを実行するにかかった時間を確認するために使用されて動作していません。のsetTimeoutは、ウィンドウは、私が「D2」と呼ばれるフォームフィールドに表示する単純なJavaScriptのクロノグラフを持っている

var milisec=0 
var seconds=0 
var complemento1="" 
document.form1.d2.value='00:00:00' 

function display(){ 
    if (milisec>=9){ 
     milisec=0 
     seconds+=1 
    } 
    else{ 
     milisec+=1 
    } 
    complemento1=complemento2=complemento3=""; 
    if ((seconds%60)<10) complemento1="0"; 
    if ((Math.floor(seconds/60)%60)<10) complemento2="0"; 
    if ((Math.floor(seconds/3600))<10) complemento3="0"; 
    document.form1.d2.value=complemento3+Math.floor(seconds/3600)+":"+complemento2+(Math.floor(seconds/60)%60)+":"+complemento1+(seconds%60) 
    setTimeout("display()",100) 
} 

問題は、ユーザーが新しいタブを開いたとき/別のプログラムを使用するときにタイマーが停止し、ウィンドウが再びフォーカスされたときに再開することです(Chromeを使用)。それは時にはうまく動作するため、時にはうまく動作しないため、最も奇妙な動作をします。

私は焦点が合っていないときに停止するスクリプトが必要な多くの投稿を見ました。正反対で、1時間以上運がないと検索しました。あなたの助けが大変ありがとう!

+1

nitpick: 'のsetTimeout(ディスプレイ、100)'へのsetTimeoutラインを変更余分な評価が生じるので、文字列を使用しないでください。 – epascarello

+0

[タブでChromeで非アクティブになっているときにsetIntervalを動作させるにはどうすればよいですか?](http://stackoverflow.com/questions/5927284/how-can-i-make-setinterval-also-work-when- a-tab-is-in-in-chrome) – epascarello

+7

Chromeは、タブのフォーカスが合っていないときに自動的にタイムアウトと間隔を調整しますが、そうしないと強制することはできませんが、特に、あなたが時間を計算している場合。タイムアウトが次の100msで実行されると仮定するのではなく、現在の時間を保存し、タイムアウトが発生した時刻と比較します。 – Mahn

答えて

3

JavaScriptタイムアウトは、特定の時刻に実行されることは保証されていません。たとえば、スレッドがタイマー終了時に何か別のものでビジー状態になっている場合、スレッドは何をしているのかを完了してからタイマーを実行します。

また、関数では表示関数内の時間が考慮されていないため、ミリ秒ごとに若干の遅延が追加されます。

タイマーを実装する正しい方法は、システム時刻を使用することです。

だから、のようなもの:

//Call at the beggining to save the start time 
var start_time = new Date() 

// Compute seconds (does not matter when/how often you call it.) 
var milliseconds_since_start = new Date().valueOf() - start_time 

は、Dateオブジェクトはまたあなたのためのクロックとしてこの期間をフォーマットすることができます

var m = new Date(milliseconds_since_start) 
m.getMinutes()+":"+m.getSeconds() 
関連する問題