Javascript 动态更新计时器上的clearTimeout

Javascript 动态更新计时器上的clearTimeout,javascript,timer,backbone.js,settimeout,Javascript,Timer,Backbone.js,Settimeout,我有一个动态更新的计时器 ------------------更新-------------------------- 当我第一次发布这个问题时,我认为从主干视图中调用计时器并不重要,但我相信因此,我不能使用全局变量(或者至少全局变量不起作用)。我将调用多个计时器,因此只设置一个全局变量并删除它将不起作用。我需要能够清除一个计时器而不清除其他计时器 我要启动计时器 function countDown(end_time, divid){ var tdiv = document.getEl

我有一个动态更新的计时器

------------------更新-------------------------- 当我第一次发布这个问题时,我认为从主干视图中调用计时器并不重要,但我相信因此,我不能使用全局变量(或者至少全局变量不起作用)。我将调用多个计时器,因此只设置一个全局变量并删除它将不起作用。我需要能够清除一个计时器而不清除其他计时器

我要启动计时器

function countDown(end_time, divid){ var tdiv = document.getElementById(divid), to; this.rewriteCounter = function(){ if (end_time >= MyApp.start_time) { tdiv.innerHTML = Math.round(end_time - MyApp.start_time); } else { alert('times up'); } }; this.rewriteCounter(); to = setInterval(this.rewriteCounter,1000); } 函数倒计时(结束时间,divid){ var tdiv=document.getElementById(divid), 到 this.rewriteCounter=函数(){ 如果(结束时间>=MyApp.start时间) { tdiv.innerHTML=Math.round(结束时间-MyApp.start时间); } 否则{ 警报(“超时”); } }; 这个。重写计数器(); to=设置间隔(此.rewriteCounter,1000); } 在我的应用程序中,我在主干视图中使用

MyApp.Views.Timer = Backbone.View.extend({ el: 'div#timer', initialize: function(){ timer = this.model; this.render(); }, events: { "clicked div#add_time": "update_timer" } render: function(){ $(this.el).append(HandlebarsTemplates['timer'](timer); this.start_timer(); }, start_timer: function(){ delete main_timer; // this doesn't work :( clearTimtout(main_timer); //this doesn't work either :( var main_timer = setTimeout(new countDown(timed.length, 'main_timer'),timed.length*1000); }, update_timer: function(){ timed.length=timed.length+30 this.start_timer(); } }); MyApp.Views.Timer=Backbone.View.extend({ el:“div#timer”, 初始化:函数(){ 定时器=此.model; 这个。render(); }, 活动:{ “单击div#添加时间”:“更新计时器” } render:function(){ $(this.el).append(把手模板['timer'](计时器); 这个。启动计时器(); }, 启动计时器:函数(){ 删除主计时器;//这不起作用:( clearTimtout(main_timer);//这也不起作用:( var main_timer=setTimeout(新倒计时(timed.length,'main_timer'),timed.length*1000); }, 更新计时器:函数(){ timed.length=timed.length+30 这个。启动计时器(); } }); 所以我要做的是更新计时器,杀死旧的计时器,然后用新的值重新启动它。我有不同的计时器,所以只调用倒计时函数中的
timed.length
,是行不通的

var main_timer = setTimeout(new countDown(timed.length, 'main_timer'),timed_length*1000);
此语句创建一个局部变量
main\u timer
。您必须创建一个全局变量,并使用该变量清除超时,如下所示

clearTimtout(main_timer);
main_timer = setTimeout(new countDown(timed.length, 'main_timer'),timed_length*1000);
clearTimeout(main_timer); 
main_timer = setTimeout(function(){
    new countDown(timed.length, 'main_timer');
},timed_length*1000);
编辑:

使用函数作为
setTimeout
处理程序,如下所示

clearTimtout(main_timer);
main_timer = setTimeout(new countDown(timed.length, 'main_timer'),timed_length*1000);
clearTimeout(main_timer); 
main_timer = setTimeout(function(){
    new countDown(timed.length, 'main_timer');
},timed_length*1000);
注意:hope
timed.length
timed\u length
是正确的

编辑:

修改
倒计时
,如下所示

function countDown(end_time, divid){
    var tdiv = document.getElementById(divid),
        to;
    this.rewriteCounter = function(){


      if (end_time >= MyApp.start_time)
      {


        tdiv.innerHTML =  Math.round(end_time - MyApp.start_time);
      }
      else {
        alert('times up');
      }
    };

    this.clearRewriteCounter = function(){
      clearInterval(to);
    }

    this.rewriteCounter();
    to = setInterval(this.rewriteCounter,1000);

    return this;
}
在MyApp.Views.Timer中

MyApp.Views.Timer = Backbone.View.extend({
 el: 'div#timer',

 initialize: function(){
     timer = this.model;
     this.render();
 },
 events: {
    "clicked div#add_time": "update_timer"
 }

 render: function(){
    $(this.el).append(HandlebarsTemplates['timer'](timer);
    this.start_timer();
 },
 start_timer: function(){
    clearTimeout(this.main_timer); 
    this.main_timer = setTimeout(function(){
        if(this.countDownInstance){
            this.countDownInstance.clearRewriteCounter();
        }
        this.countDownInstance = new countDown(timed.length, 'main_timer');
    },timed_length*1000);
 },

 update_timer: function(){
   timed.length=timed.length+30
  this.start_timer();
 }
});

请注意,您需要一个全局变量来保存
setTimeout()
返回的值,以便以后使用
clearTimeout()
。对
setTimeout()
返回的值调用delete无效。另外,请注意您在
clearTimtout()上所做的拼写错误
。此外,您正在函数
start\u timer()中将main\u timer重新定义为局部变量
函数存在后,其值不会保存。谢谢Yaniro,我更新了问题。谢谢Diode,我尝试使用全局变量,但正如我在问题中提到的,我有多个计时器,因此全局计时器并不适合我。我没有提到的是,计时器是从backbone.js视图中调用的,这可能会导致错误这就是我无法访问全局变量的原因,但我不能完全确定。看完你的问题后,我明白了问题所在。请查看更新的答案。