このコードをここに投稿しました: http://jsfiddle.net/mN6Gy/12/
問題は、秒単位で数字をスキップすることです (30、25、24、23、22、21、20、15 など)。
秒が 00 に達すると、99、98、97、96 に戻ります...!!
コードでこれを見つけるための助けは素晴らしいでしょう!
ありがとう、
デビッド
このコードをここに投稿しました: http://jsfiddle.net/mN6Gy/12/
問題は、秒単位で数字をスキップすることです (30、25、24、23、22、21、20、15 など)。
秒が 00 に達すると、99、98、97、96 に戻ります...!!
コードでこれを見つけるための助けは素晴らしいでしょう!
ありがとう、
デビッド
ああ、これはデバッグするのが楽しくありませんでした-そして、私はすべての答えを持っているかどうかわかりません...
私が見つけた問題は、日数が多すぎるため、インデックスがオフになっていることです。
Options.format: "dd:hh:mm:ss"
> Actually have '119:01:16:18' (for example)
したがって、ループしているときは、すべてのインデックスが 1 つずれています。しかし、時間が100日未満になると、それは正しいでしょう-私は思います.
私が何を意味するかを理解するためのハックな解決策として (したがって、修正を開始する場所があるかもしれません)、次の編集スニペットを参照してください。
switch (options.format[i]) {
case 'h':
digits[c].__max = ((c-1) % 2 == 0) ? 2: 9; // <== EDIT
if (c % 2 == 0)
digits[c].__condmax = 4;
break;
case 'd':
digits[c].__max = 9;
break;
case 'm':
case 's':
digits[c].__max = ((c-1) % 2 == 0) ? 5: 9; // <== EDIT
}
通常、コードは正常に動作しているように見えます。x
数秒後、カウンターのカウントx
が少なくなります。setInterval()
コード内の関数
setInterval(moveStep(digits.length - 1), 1000);
moveStep()
1000 ミリ秒ごと、つまり毎秒呼び出します。ただし、コンピューター、オペレーティング システム、およびブラウザーがミリ秒単位で完全に正確であることは期待できません。イベントが早くトリガーされることもあれば、後でトリガーされることもあります (特に、コードを妨害したり遅くしたりする可能性のある他のプログラムも実行している場合)。そのため、代わりに
counter=2 - 1 second delay - counter=1 - 1 second delay - counter=0
あなたが得る
counter=2 - 2 second delay - counter=1 - counter=0
またはそのようなもの。この場合、次のイベントがトリガーされて に設定されるcounter=1
とすぐに再描画されるため、は表示されません。counter
0
あなたができることの1つは、setTimeout
の代わりに使用するsetInterval
ことです。
var callback = function() {
moveStep(digits.length - 1);
setTimeOut(callback, 1000);
}
setTimeOut(callback, 1000);
この場合、時限イベントは、前のケースのように、キューに並んで一度にトリガーされることはありません。これは、間隔を設定せず、タイムアウトだけを設定しているためです。次のイベントは、現在のイベントが終了してから 1 秒後に発生するようにスケジュールされています。このようにして、2 つのイベント間の時間は常に (約) 1 秒になります。
ただし、ここでの問題は、おおよその世界にあります。最初のケースでsetInterval()
は、イベントが今から 1 秒、2 秒、3 秒など発生するようにスケジュールされます。そのため、x
数秒後、カウンターは だけ減少しますがx
、すべてのステップで再描画されない場合があります。ただし、2 番目のケースでは、 を使用するsetTimeout
と、1000 ミリ秒からのわずかなずれがゆっくりと蓄積される可能性があるため、カウンターは数秒x*1.1
後に減少するか、またはそのようなものになります。x
つまり、時間通りに到着することを保証することはできません。
要約すると、あなたは共通の問題に直面しており、setInterval
それについてできることはあまりないと思います。