2014-04-26 80 views
0

我創建了一個倒計時的功能,但它只是在開始時,然後停止。setInterval的工作只是一個時間,然後停止

var rek_inter = setInterval(cnt(s_, d), 1000);  

function cnt(deg, deg2) { 
    deg--; 
    while (deg < 0) { 
     deg = 59; 
     deg2--; 
    } 
    if (deg2 < 0) { 
     $('#s_').html("ok"); 
    } else if (deg2 >= 0) { 
     var d_sn = fixd(deg2); 
     var s_sn = fixd(deg); 
     $('#s_').html(d_sn + ":" + s_sn); 
    } 
} 

function fixd(g) { 
    if (g < 10) { 
     return '0' + g; 
    } 
    return g; 
} 

我也試過,

var rek_inter = setInterval(function() {cnt(s_, d);}, 1000); 

但結果是一樣的。

如果我把函數到區間功能類似:

var rek_inter = setInterval(function() { 

     s_--; 
     while (s_ < 0) { 
      s_ = 59; 
      d--; 
     } 
     if (d < 0) { 
      $('#s_').html("ok"); 
     } else if (d >= 0) { 
      var d_sn = fixd(d); 
      var s_sn = fixd(s_); 
      $('#s_').html(d_sn + ":" + s_sn); 
     } 
    }, 1000); 

    function fixd(g) { 
     if (g < 10) { 
      return '0' + g; 
     } 
     return g; 
    } 

它的工作原理。但是我需要這些,因爲我在頂部寫了第一個。這裏可能是什麼問題和解決方案?

+0

http://jsbeautifier.org – Pointy

+0

你能分享你的html嗎?或把它放在小提琴裏? – agconti

+2

你的第二次嘗試(將函數中的「cnt」調用包裝在這裏)會起作用。我建議你重新嘗試一下。 – Pointy

回答

2

「我有很多s_,s_2,s_3 ....和d,d1,d2 ...值,我想在單setInterval中使用它們,這就是爲什麼我嘗試使用cnt(s_, d);如果將工作我會寫CNT(S_2,D2),CNT(S_3,D3)。」

你可以只使用閉包,你的優勢在這裏。

var rek_inter1 = setInterval(cnt(s_2, d2), 1000), 
    rek_inter2 = setInterval(cnt(s_3, d3), 1000); 

function cnt(deg, deg2) { 
    return function() { 
     deg--; 
     while (deg < 0) { 
      deg = 59; 
      deg2--; 
     } 
     if (deg2 < 0) { 
      $('#s_').html("ok"); 
     } else if (deg2 >= 0) { 
      var d_sn = fixd(deg2); 
      var s_sn = fixd(deg); 
      $('#s_').html(d_sn + ":" + s_sn); 
     } 
    }; 
} 
+0

是的,它的工作;) – ctarimli

2

的第一次嘗試是一樣的:

setInterval (value, time) ; 

這裏value = cnt(s_, d),將CNT函數的調用的結果。
這不能工作,因爲setInterval需要一個函數。太糟糕了,它在JavaScript中靜靜地失敗。

在第二次嘗試中,問題是,你只修改功能變種,因此可能會出現沒有變化:在更改度,DEG2的時候,其實你想改變S_和d。

第三次嘗試是正確的,因爲你倆都調用一個函數,改變全局S_和d。 我寧願寫這種方式:

var rek_inter = setInterval(iterate , 1000); 

function iterate() { 
    s_--; 
    while (s_ < 0) { 
     s_ = 59; 
     d--; 
    } 
    if (d < 0) { 
     $('#s_').html("ok"); 
    } else if (d >= 0) { 
     var d_sn = fixd(d); 
     var s_sn = fixd(s_); 
     $('#s_').html(d_sn + ":" + s_sn); 
    } 
} 

編輯: 的O.P. mentionned他要處理一組(S_,d)參數。
我建議你創建對象的數組,它包含這樣的參數:

var sdParameters = []; 
sdParameters.push({ s : some value , d: some other value}); 
sdParameters.push({ s : some value 2, d: some other value 2 }); 
... // (or using a for loop to grab the ds and ss if possible) 

然後每個s/d對象由它的索引定義之後,所以用:

function iterate (ind) { 
    var s_ = --sdParameters[ind].s ;  
    while (s_ < 0) { 
     s_ = 59; 
     sdParameters[ind].d--; 
    } 
    var d = sdParameters[ind].d; 
    if (d < 0) { 
     $('#s_').html("ok"); 
    } else if (d >= 0) { 
     var d_sn = fixd(d); 
     var s_sn = fixd(s_); 
     $('#s_').html(d_sn + ":" + s_sn); 
    } 
} 

,你可以有你的一個單一的全球陣列上運行時的時間間隔:

 var rek_inter = setInterval(iterate.bind(null,0) , 1000); 
    var rek_inter1 = setInterval(iterate.bind(null,1) , 1000); 

(很明顯,你可以/應間隔存儲在數組中,你可能會內SDP將它們存儲arameters。

一個最後一句話:我無法使用相關的變量名,因爲我無法猜測的使用。當事情變得越來越複雜時,在你的代碼中使用重要的名字會有很大的幫助。

+1

Globals是邪惡的;) – plalx

+0

我有很多s_,s_2,s_3 ....和d,d1,d2 ...值,我想單獨使用它們setInterval,這就是爲什麼我嘗試使用cnt(s_,d);如果這將工作,我會寫cnt(s_2,d2),cnt(s_3,d3).. – ctarimli