使用javascript,jQuery启动和停止/暂停setInterval

我试图暂停,然后播放一个setInterval循环。

在我停止循环后, 我尝试的“开始”按钮似乎不起作用:

HTML:

    

JS:

 input = document.getElementById("input"); function start() { add = setInterval("input.value++",1000); }start(); 

有没有更好的/工作方式来做到这一点? 你可以自由使用jQuery。

谢谢!

您遇到此特定问题的原因:

jsFiddle将您的代码包装在函数中,因此未在全局范围中定义start()

在此处输入图像描述


故事的道德:不要使用内联事件绑定。 使用addEventListener / attachEvent


其他说明:

不要将字符串传递给setTimeoutsetInterval 。 这是伪装的eval

使用函数代替,并使用var和white空间来舒适:

 var input = document.getElementById("input"), add; function start() { add = setInterval(function () { input.value++; }, 1000); } start(); 

请参阅jsFiddle的工作演示: http //jsfiddle.net/qHL8Z/3/

HTML

    

使用Javascript

 $(function() { var timer = null, interval = 1000, value = 0; $("#start").click(function() { if (timer !== null) return; timer = setInterval(function () { $("#input").val(++value); }, interval); }); $("#stop").click(function() { clearInterval(timer); timer = null }); }); 

正如你已经标记了这个jQuery ……

首先,在输入按钮上放置ID并删除内联处理程序:

    

然后将所有状态和函数封装在一个闭包中:

为更清晰的实现更新了EDIT ,这也解决了@Esailija对使用setInterval()的担忧。

 $(function() { var timer = null; var input = document.getElementById('input'); function tick() { ++input.value; start(); // restart the timer }; function start() { // use a one-off timer timer = setTimeout(tick, 1000); }; function stop() { clearTimeout(timer); }; $('#start').bind("click", start); // use .on in jQuery 1.7+ $('#stop').bind("click", stop); start(); // if you want it to auto-start }); 

这可确保您的所有变量都不会泄漏到全局范围内,也无法从外部修改。

(更新) http://jsfiddle.net/alnitak/Q6RhG/的工作演示

add是局部变量而不是全局变量试试这个

 var add; var input = document.getElementById("input"); function start() { add = setInterval("input.value++",1000); }start(); 
 (function(){ var i = 0; function stop(){ clearTimeout(i); } function start(){ i = setTimeout( timed, 1000 ); } function timed(){ document.getElementById("input").value++; start(); } window.stop = stop; window.start = start; })() 

http://jsfiddle.net/TE3Z2/

您无法在执行中停止计时器function。 您只能在完成后捕获它并防止它再次触发。