2014-05-10 207 views
0

我有一個函數stats_check(),它設置和清除函數stats()的計時器。但問題是,這個函數每2秒運行一次,如果條件爲真,它會設置計時器並啓動stats()。但我想每2秒鐘檢查一次,但每5秒啓動一次函數統計()。我怎樣才能做到這一點?每2秒啓動一次,每5秒啓動一次

$(function stats_check() { 
    var sections = document.getElementsByTagName("section"); 
    window.setInterval(function() { 
     for (i=0; i<sections.length; i++) { 
      if (sections[i].className == "present") { 
       if (sections[i].id.match(/^stats-.*$/)) { 
        timer = setInterval(function(){stats()}, 5000); 
       } 
       else { 
        clearInterval(timer); 
       } 
      } 
     } 
    }, 2000); 
}); 

回答

1

你可以做這樣的:

$(function stats_check(){ 
    var shouldRunTimer = false, 
     sections = document.getElementsByTagName("section"); 
    window.setInterval(function(){ 
     for(var i=0; i<sections.length; i++) { 
      if(sections[i].className === "present") { 
       shouldRunTimer = sections[i].id.match(/^stats-.*$/); 
      } 
     } 
    },2000); 

    var timer = setInterval(function(){ 
     if(shouldRunTimer) 
      stats(); 
    }, 5000); 
}); 

function stats(){ 
    console.log("runs stats"); 
} 

在本撥弄它的工作原理看出:http://jsfiddle.net/D669N/

這樣做是:

  • 集2秒計時器,其中你檢查條件
  • 如果條件是真的,讓stats函數運行,否則不允許它
  • 設置5秒定時器,你檢查,如果你被允許運行stats功能

我也做了一些更正代碼:

  • var加到for循環中的i。如果您不添加var它將會在全局範圍內運行,並且這很糟糕,並且可能會產生真正難以調試的錯誤。

  • 使用===而不是==來比較className,因爲在這種情況下,它比==好。

你可以閱讀更多關於這些2最後的意見在其他答案在stackoverflow,有很多。