let second = 2 // Make more realistic instead of 60
let minute = 1
let mytimer = setInterval(function(){
let timer = second--
console.log(minute + ':' + timer)
if(second==0){
second = 59
minute--
}
if(minute==0){
clearInterval(mytimer);
}
},10)
如您所见,这是相当简单的代码,但其中有一个奇怪的错误。我的计时器不计时。当计时器结束时,它会在0点01分停止。它本身可以完美地工作,但当它达到1:00或0:00时,它完全忽略0,并从1:01跳到0:59。我也试过这个解决方案,但它也不起作用。我现在该怎么办呢?(顺便说一句,我之前的问题不够好,我希望这次我能得到一个更好的解释)
您的代码在min为0时停止,而不是在min和sec为0时停止。你需要改变你的逻辑来考虑这一点。
let second = 0;
let minute = 2;
let mytimer = setInterval(function() {
second--;
if (second === 0 && minute === 0) {
clearInterval(mytimer);
} else if (second < 0) {
second = 60 + second;
minute--;
}
console.log(minute + ':' + second.toString().padStart(2, '0'))
}, 1000)
现在setInterval是不准确的。它会浮起来。因此,最好使用a时间戳来获取差异。
function msToTime(ms) {
const seconds = Math.floor((ms / 1000) % 60).toString().padStart(2, '0');
const minutes = Math.floor((ms / (1000 * 60)) % 60).toString().padStart(2, '0');
return `${minutes}:${seconds}`;
}
const countDownTime = (outElem, ms) => {
const endTS = Date.now() + ms;
let timer;
const display = text => outElem.textContent = text;
const countDown = () => {
const diff = endTS - Date.now();
if (diff < 0) {
display("00:00");
window.clearTimeout(timer);
return;
}
const ts = msToTime(diff);
display(ts);
};
countDown();
window.setInterval(countDown, 10);
};
countDownTime(document.querySelector('#out'), 2*60*1000);
<div id="out"></div>
问题是您的函数每10毫秒执行一次,所以当计时器达到1:00时,它将跳过第二个零并立即跳转到0:59。要解决这个"问题",你可以将间隔时间从10毫秒更改为1000毫秒,这样它就会正确显示1:00。要做到这一点,你必须把最后的10替换掉。
这个给了我你想要的答案,
let second = 59 // Make more realistic instead of 60
let minute = 1
let mytimer = setInterval(function(){
let timer = second--
console.log(minute + ':' + timer)
if(second<0){
second = 59
minute--
}
if(minute==0){
clearInterval(mytimer);
}
},10)