Ruby Rails - JS - 在AJAX中停止以前的脚本

时间:2012-05-18 10:47:56

标签: javascript ruby ruby-on-rails-3

我有这个改变的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);
});

1 个答案:

答案 0 :(得分:0)

那是因为 运行了多个时间间隔。您需要通过clearInterval(int)清除希望停止的时间间隔。要么是这样,要么确保只对任何给定的函数运行setInterval一次。

此外,除了这一点,但是将字符串作为setInterval的参数是一件坏事(tm)。请改用setInterval(clock, 1000)

同样#2,我可以简单地说出一个名为int的变量令人困惑,即使它完全合法吗? :P