2012-08-02 69 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