2012-08-02 79 views
7

我的Jquery:jQuery的復位定時器的setInterval

function myTimer() { 
    var sec = 15 
    var timer = setInterval(function() { 
    $('#timer').text(sec--); 
    if (sec == -1) { 
     clearInterval(timer); 
     alert('done'); 
    } 
    } , 1000); 

} 

$("#knap").click(function() { 
    myTimer(); 
}); 

$("#reset").click(function() { 
// set timer to 15 sec again.. 
}); 

我希望計時器上#reset點擊後復位。

回答

10

你需要離開你的「定時器」變量的作用域是可用下次呼叫爲myTimer功能,這樣你就可以清除現有的間隔,並用新的區間重置時間。嘗試:

var timer; 
functionn myTimer() { 
    var sec = 15 
    clearInterval(timer); 
    timer = setInterval(function() { 
    $('#timer').text(sec--); 
    if (sec == -1) { 
     clearInterval(timer); 
     alert('done'); 
    } 
    } , 1000); 

} 

$("#knap").click(function() { 
    myTimer(); 
}); 

$("#reset").click(function() { 
    myTimer(); 
}); 
+4

-1醜陋的解決方案與全局變量... – Christoph 2012-08-02 15:51:54

+0

我會接受你的答案。 – 2012-08-02 15:51:59

+0

一流的代碼。謝謝。 – Kavin 2014-11-15 17:38:25

1

清除每一個它的initalized時間的計時器,這樣你所要做的就是再次調用該函數復位定時器:

var timer; 

function myTimer(sec) { 
    if (timer) clearInterval(timer); 
    timer = setInterval(function() { 
     $('#timer').text(sec--); 
     if (sec == -1) { 
      clearInterval(timer); 
      alert('done'); 
     } 
    }, 1000); 
} 

$("#knap, #reset").click(function() { 
    myTimer(15); 
}); 

FIDDLE

2

你可以重新寫你的myTimer()功能就像這樣:

function myTimer() { 
    var sec, timer = null; 

    myTimer = function() { 
     sec = 15; 
     clearInterval(timer); 

     timer = setInterval(function() { 
      $('#timer').text(sec--); 
      if (sec == -1) { 
       clearInterval(timer); 
       alert('done'); 
      } 
     } , 1000); 
    }; 

    myTimer(); 
} 

現在,無論何時ü打電話myTimer(),該setInterval被複位。

7

,或者你可以做這些方針的東西:

var myTimer = function(){ 
    var that = this, 
     time = 15, 
     timer; 
    that.set = function() { 
     console.log('setting up timer'); 
     timer = setInterval(function(){ 
      console.log('running time: ' + time); 
     },1000); 
    } 
    that.reset = function(){ 
     console.log('clearing timer'); 
     clearInterval(timer); 
    } 
    return that; 
}(); 

和運行時,你需要:

myTimer.set(); myTimer.reset();

+1

很可能不能以'在所有 – GnrlBzik 2016-11-04 18:28:40

0

這裏有一個辦法,更符合JS設計(爲那些誰還不知道函數式語言)的方式調整。而不是依靠一個全局變量,使用閉包:

$("#knap").click(function start()//named callback to bind && unbind: 
{ 
    $(this).unbind('click');//no need to start when started 
    $("#reset").unbind('click').click((function(timer) 
    {//timer is in scope thanks to closure 
     return function() 
     {//resets timer 
      clearInterval(timer); 
      timer = null; 
      $('#knap').click(start);//bind the start again 
      //alternatively, you could change the start button to a reset button on click and vice versa 
     } 
    })(setInterval((function(sec) 
     { 
      return function() 
      { 
       $('#timer').text(sec--); 
       if (sec === -1) 
       { 
        $('#reset').click();//stops interval 
        $('#reset').unbind('click');//no more need for the event 
        alert('done'); 
       }//here's the interval counter: 15, passed as argument to closure 
      })(15),1000)));//set interval returns timer id, passed as argument to closure 
}); 

現在,我承認這是相當混亂(和未經測試),但這種方式存在重置事件僅當它是必要的,你不使用任何全局變量。但最重要的,這就是JS的強大之處在於:作爲第一類對象,將它們作爲參數和返回值...只是去功能瘋狂:)

我已經成立了一個工作Fiddle,太

+0

變種that'打擾我喜歡你對此,但這是有點難以閱讀:) – GnrlBzik 2012-08-02 16:15:11

+0

據介紹,第一次......但現在我寫了這麼多JS,千行(沒有jQuery,但純JS),你真的很習慣它。只是忽略了許多支架和重點'回報function'線,通常只是在他們之上,封閉的匿名函數開始,及以下,你看到的參數。這種方法還允許您將DOM引用作爲參數傳遞。如代碼所示,每個時間間隔'$('#timer')。文本(sec - );'再次掃描dom,而傳遞參考只發生一次,而不管間隔調用的數量如何:大性能優勢 – 2012-08-02 16:27:58

+0

我覺得你只是來自咖啡腳本,對我的眼睛很好格式化,以及所有魔術包裝。 – GnrlBzik 2012-08-02 16:35:58