0

setTimeout に問題があります。

すべての主要なブラウザーでは正常に動作しますが、IE では動作しません... Facebook アプリのパズルを作成しています。プレイヤーがスタートボタンを押すと、タイマーが1ゲームのプレイ時間をカウントし始めます。最初は setInterval を使用してタイマーを増やしましたが、Facebook スクリプトの協力により、ゲームの終了時に約 2 秒遅れました。次に、タイマーの精度を高めるためのスタックオーバーフローのトリックを見つけました 。Facebookでは、まだ遅延があります。ここで、興味のある情報を要約します。ユーザーが [開始] をクリックすると、新しい日付を startTime として作成します。ユーザーがゲーム スクリプトを終了すると、新しい日付の finalTime が作成され、finalTime - startTime が差し引かれます。

コードにはsetTimeoutがあります:

(...)    

f : function() {
        var sec_time = Math.floor((puzzle.nextAt - puzzle.startTime)/1000);
        $('.timer').html(sec_time);
        if (!puzzle.startTime) {
            puzzle.startTime = new Date().getTime();
            puzzle.nextAt = puzzle.startTime;
            $('.timer').html('0');
        }
        puzzle.nextAt += 100;
        puzzle.to = setTimeout(puzzle.f, puzzle.nextAt - new Date().getTime());
    }

(...)    

ユーザーが最後のパズルのピースを正しい場所に配置したら、clearTimeout(puzzle.to); を呼び出します。

私は今2つの問題があります:

  1. 正確な時間ではありませんが、IE では 7 秒の差さえあります!

  2. ゲーム中のIEでは、ユーザーがマウスダウンしている場合にのみ機能します... :/

パズルをドラッグするには、jQuery ドラッグ アンド ドロップ プラグインを使用します。少なくとも非常に役立つ情報は、正確なタイマーを達成する方法です。

4

1 に答える 1

0

スクリプトは、ページの下部ではなく、jQuery の ready 関数に配置する必要があります。Facebook SDK は非同期で読み込まれ、ページの下部で開始されると時間指定の実行に影響を与える可能性があるためです。

タイミングに関しては、ページ上の他の JS の実行に応じて、IE7 で 15 ミリ秒から 45 ミリ秒の不正確さが見られます。このため、100 ミリ秒のタイムアウトがひどくドリフトします。開始時刻を記録し、ポーリング頻度が必要以上に高いタイマーを作成し、各サイクルで開始時刻と「現在」を比較して次に何をすべきかを判断することをお勧めします。

于 2012-05-29T21:25:28.533 に答える