为什么我的倒数计时器没有开始和停止?
Why won't my countdown timer start and stop?
我需要做一个简单的倒计时定时器从5到0,用按钮开始和停止计数器。我唯一不知道的是为什么我的计数器停不下来。
代码如下:
function clock() {
var myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
<p id="demo">5</p>
<button onclick="clock()">Start counter</button>
<button onclick="clearInterval(myTimer)">Stop counter</button>
好了,您只需要使myTimer
全局。我还修复了一个小故障,在重置计时器后,它不会显示5.
var myTimer;
function clock() {
myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
<p id="demo">5</p>
<button onclick="clock(); document.getElementById('demo').innerHTML='5';">Start counter</button>
<button onclick="clearInterval(myTimer);">Stop counter</button>
简单粗暴的回答
var myTimer;
function clock() {
myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
<p id="demo">5</p>
<button onclick="clock()">Start counter</button>
<button onclick="clearInterval(myTimer)">Stop counter</button>
函数中的 timer
(因为它在函数中声明了var
)只能在函数中访问。将var
声明移出函数使其成为全局的。
更好的解决方案
但是把东西放在全局作用域中(大多数情况下)是一个坏主意。所以…有更好的办法:
var myTimerObj = (function(document){
var myTimer;
function start() {
myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
function end() {
clearInterval(myTimer)
}
return {start:start, end:end};
})(document);
<p id="demo">5</p>
<button onclick="myTimerObj.start()">Start counter</button>
<button onclick="myTimerObj.end()">Stop counter</button>
更好的解决方案是使用揭示模块模式,将timer
保存在私有作用域中,Tl;Dr它阻止timer
污染全局作用域。
myTimer
仅在函数范围内。一个解决方案是使它全局化。
var myTimer;
function clock() {
myTimer = setInterval(myClock, 1000);
var c = 5;
function myClock() {
document.getElementById("demo").innerHTML = --c;
if (c == 0) {
clearInterval(myTimer);
alert("Reached zero");
}
}
}
<p id="demo">5</p>
<button onclick="clock()">Start counter</button>
<button onclick="clearInterval(myTimer)">Stop counter</button>
这个解决方案在react JS中为我工作
let Timer =(function(){
let timerObject;
let callback=null;
let seconds=0;
let counter=()=>{
seconds++;
console.log("seconds",seconds);
if (callback!==undefined) callback(seconds);
}
let setCallback=(_callback)=>{callback=_callback }
let getSeconds=()=>{ return seconds;}
let reset=()=>{ seconds=0;}
let start=()=>{timerObject=setInterval(counter,1000);}
let end=()=>{clearInterval(timerObject);}
return {"start":start,"end":end, "getSeconds":getSeconds, "reset":reset,"setCallback":setCallback}; })();
export default Timer;
相关文章:
- 我可以'我似乎没有得到我的网站'移动导航开始工作
- 如果在一段时间不活动后4秒内开始加载,如何刷新我的网站
- 我的jQuery.hooper's工作得很好,但我可以;t get.点击开始工作
- 如何在我的 rails 应用程序中开始使用 JQuery/FullCalendar
- 我刚刚开始使用 MEAN 堆栈.我试图将我的表单提交数据存储到 mongo 数据库,但我无法这样做
- 只有当我使用 vivus.js 到达底部时,我的 svg 动画才会开始
- 我的网站刚刚开始扭曲,但仅在铬上
- 我怎样才能开始使用摩卡并进行我的第一次测试
- 我如何采用两个日期选择器并使用我的开始和结束日期对数据进行排序,但 json 数据包含 5/12/2016,而角度仅排序
- 如何开始动态更新我的网站
- 为什么每次我在 AJAX 中使用 .load() 时,我的 .ajaxForm() 开始重定向
- 如何让我的箭头小部件在第二次单击时向后旋转以开始
- 获取我的页面开始运行 angularjs 的时间
- 让我的计算器开始工作
- 我的Greasemonkey脚本开始加载一系列图像.如何在需要时停止它
- 我的 JQuery 代码中有什么错误吗?彩票只能在点击开始后移动一步
- 如何制作我的网页,如果有人关闭了它,那么下次打开时应该从同一个页面开始
- 在我的网站上嵌入Google Hangout(从y网页开始功能齐全)
- 如何开始我的jquery隐藏开关
- 是否有什么问题的方式我'我开始我的脚本?试图让数组对每个答案输出不同的响应