6

「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 時間以上検索しても運がありませんでした。あなたの助けは大歓迎です!

4

1 に答える 1

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()
于 2015-01-17T14:26:10.830 に答える