2012-03-10 58 views
0

我有一個計時器,我正在動態更新。clearTimeout動態更新計時器

------------------ update -------------------------- 當我第一次發佈這個問題時,我認爲它並不重要,因爲計時器是從骨幹視圖中調用的,但我相信作爲這個結果,我不能使用全局變量(或者至少是一個全局變量不工作)。我將調用多個定時器,因此只設置一個全局變量並刪除它將不起作用。我需要能夠清除一個定時器而不清除其他定時器。

我開始什麼定時器,

 
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); 
} 

在我的應用程序,我開始與

 
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(); 
} 
}); 

中的骨幹視圖的計時器,這樣我想要做的是更新計時器,終止舊的定時器,然後用新值重新啓動它。我有不同的計時器,所以在倒計時功能中調用timed.length將不起作用。

+0

請注意,你需要一個全局變量來持有'的setTimeout()返回'以'clearTimeout()'後使用的值。調用'setTimeout()'返回的值不起作用。另外,請注意你在'clearTimtout()'上做的拼寫錯誤。此外,在函數「start_timer()」中,您將main_timer重新聲明爲一個局部變量,該函數在函數存在後不會保存其值。 – Yaniro 2012-03-10 18:52:49

+0

謝謝Yaniro,我更新了這個問題。 – pedalpete 2012-03-10 20:40:57

回答

2
var main_timer = setTimeout(new countDown(timed.length, 'main_timer'),timed_length*1000); 

此聲明創建了一個局部變量main_timer。相反,你必須創建一個全局變量,並用它來清除超時如下圖所示

clearTimtout(main_timer); 
main_timer = setTimeout(new countDown(timed.length, 'main_timer'),timed_length*1000); 

編輯:

使用功能setTimeout處理程序如下圖所示

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

注意:希望timed.lengthtimed_length是正確的。

編輯:下面

修改countdown等給出。

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(); 
} 
}); 
+0

感謝二極管,我試過使用全局變量,但正如我在問題中提到的,我有多個定時器,所以全局變量並不完全適用於我。我沒有提到的是,計時器是從backbone.js視圖中調用的,這可能是我無法訪問全局變量的原因,但我不完全確定。 – pedalpete 2012-03-10 20:40:38

+0

通過您的問題後,瞭解問題是什麼..請參閱更新的答案。 – Diode 2012-03-10 21:20:12