2013-09-26 40 views
2

我使用MVC一些局部渲染和ajax調用。在我的一個結果表中,我有一個定時器字段。setInterval javascript調用不會消失後ajax加載

以下代碼位於每30秒呈現的部分視圖中。其中一個字段是一個積極的計時器顯示給用戶:

<td><div id="@someID" class="nobutton"></div><script>setInterval(function() { startTimer('@startDateTime', '@someID') }, 500);</script></td> 

這個偉大的工程,但AJAX調用,以刷新部分後,間隔功能仍然調用舊編號(someID),其不再存在。

下面是計時器的JavaScript:

<script type="text/javascript"> 
    function startTime(dt, field){ 
     var field = document.getElementById(field); 
     if (field == null) 
      return; 

     var rowTime = new Date(dt); 
     var rowTimems = rowTime.getTime(rowTime); 

     var currentTime = new Date(); 
     var currentTimems = currentTime.getTime(currentTime); 

     var difference = currentTimems - rowTimems; 

     var hours = Math.floor(difference/36e5), 
      minutes = Math.floor(difference % 36e5/60000), 
      seconds = Math.floor(difference % 60000/1000); 

     field.innerHTML = formatTime(hours) + ":" + formatTime(minutes) + ":" + formatTime(seconds); 
</script> 

這刷新部分的主網頁上的呼叫是非常簡單的:

var t = setInterval(function() { 
      $.ajax({ 
       url: "MYURL", 
       type: "GET", 
       cache: false, 
       success: function (data) { 
        $("#summary").html(data);      
       } 
      }); 
     }, 30000); 

有沒有辦法殺老計時器?他們爲什麼還在跑?

+1

您需要在再次執行ajax刷新之前清除間隔。 – PSL

回答

2

代碼仍在執行的原因是間隔從未停止過。相反,嘗試在你的部分。它將檢查前面的間隔計時器是否存在並清除它。

<td><div id="@someID" class="nobutton"></div> 
<script> 
if(window.prtInt != void 0) clearInterval(window.prtInt);//void 0 means undefined 
window.prtInt = setInterval(function() { startTimer('@startDateTime', '@someID') }, 500); 
</script></td> 

如果你想清除出整個頁面上的所有定時器(可能具有不良影響),那麼你可能會得到一個新的計時器的整數,並循環到那個數結算仍然存在的時間間隔。

<script> 
function clrTimers(){ 
    var clr = setTimeout(function(){},10); 
    for(var i = 0; i < clr; i++){ 
    clearInterval(i); 
    } 
} 
</script> 

如果你想跳過一些,那麼你可以包括它們與繼續關鍵字,如果你知道他們。如

for(var i = 0; i < clr; i++){ 
if(i == t) continue; //I believe t was your ajax interval variable 
clearInterval(i); 
} 
+0

我認爲如果我只有一行數據,這將工作得很好。有沒有辦法清除所有間隔? –

+0

@PapaBurgundy - 有。但是,這也會清除您正在進行的ajax調用的計時器。看到我上面的編輯。 –

+1

我最終在主頁上聲明瞭一個javascript數組,並在構建每一行時將setInterval整數ID添加到數組中。然後在ajax重新加載我clearInterval數組中的任何ID。你的回答讓我朝那個方向前進,謝謝。 –

2
setInterval(function() { startTimer('@startDateTime', '@someID') }, 500); 

將繼續與相同的值執行,直到它與clearInterval()清除。爲了清除它,你需要將它保存爲var並將其提供給clearInterval()函數。

+0

謝謝。這個答案也讓我走上了正確的道路。 –