0

タイマーをカウントアップするために、この変更されたjavascriptがあります。スクリプトは問題なく動作します。しかし、私はこれを ajax 応答で使用しています。初めて ajax クエリを実行すると、応答で JS が返され、この時計は正常に動作します。しかし、その最初のリクエストの後にさらにリクエストを行うと、複数の setInterval が実行されているかのようにタイマーが混乱し、制御されていないカウントが発生し、秒単位でスムーズにカウントアップするのではなく、新しい ajax 応答ごとに統計が高速に実行されます。どうすればこれを回避できますか?

function calcage(secs, num1, num2) {
  s = ((Math.floor(secs/num1))%num2);
return s;
}

function clock() {
++startNumber;

  DisplayStr = displayFormat.replace(/%%D%%/g, calcage(startNumber,86400,100000));

        t = calcage(startNumber,3600,24);
        if (t < 10) {
    DisplayStr = DisplayStr.replace(/%%H%%/g, "0"+t);
        } else {
        DisplayStr = DisplayStr.replace(/%%H%%/g, t);
        }

        t = calcage(startNumber,60,60);
        if (t < 10) {
    DisplayStr = DisplayStr.replace(/%%M%%/g, "0"+t);
        } else {
        DisplayStr = DisplayStr.replace(/%%M%%/g, t);
        }

        t = calcage(startNumber,1,60);
        if (t < 10) {
    DisplayStr = DisplayStr.replace(/%%S%%/g, "0"+t);
        } else {
        DisplayStr = DisplayStr.replace(/%%S%%/g, t);
        }

$("#counter").html(DisplayStr);
}

$('#view').html(<%= (render :partial => 'ajax_response').to_json.html_safe %>);
#partial render and read "#timer" value as integer to start ahead. "#timer" is in "#view" div
$(function(){
c = $("#timer").val();
startNumber = parseFloat(c);
displayFormat = "%%D%% Days, %%H%%:%%M%%:%%S%%";
var int=self.setInterval("clock()",1000);
});
4

1 に答える 1

0

これは、複数の間隔が実行されているためです。を実行して停止したい場合は、間隔をクリアする必要がありますclearInterval(int)setIntervalそれか、特定の関数に対して一度だけ実行するようにします。

また、ポイントに加えて、文字列をパラメーターとして使用することsetIntervalは悪いことです (tm)。setInterval(clock, 1000)代わりに使用してください。

intまた、#2、完全に合法であっても、と呼ばれる変数を持っていることがどれほど混乱しているのか一言言えますか?:P

于 2012-05-18T10:52:06.103 に答える