我需要制作一个简单的倒数计时器,从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>
答案 0 :(得分:6)
在这里,您只需要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>
答案 1 :(得分:3)
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>
答案 2 :(得分:3)
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");
}
}
}
&#13;
<p id="demo">5</p>
<button onclick="clock()">Start counter</button>
<button onclick="clearInterval(myTimer)">Stop counter</button>
&#13;
函数中的
timer
(因为它在函数内声明了var
)只能在函数内部访问。将var
声明移到函数之外会使其成为全局声明。
但是把事情放在全球范围内是(mostly) a bad idea。所以.....有一个更好的方法:
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);
&#13;
<p id="demo">5</p>
<button onclick="myTimerObj.start()">Start counter</button>
<button onclick="myTimerObj.end()">Stop counter</button>
&#13;
更好的解决方案使用revealing module pattern并将timer
保留在私有范围内, Tl; Dr 会阻止timer
污染全局范围。
答案 3 :(得分:0)
此解决方案在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;