看到跳跃的数字,主要问题是由于字符串连接,然后使用在该字符串日期功能。部分代码,例如这样的:
if (min < 10){
min = "0" + min;
}
一个例子证明为什么发生这种情况
var end1 = new Date();
var minutesleft1 = 9;
console.log("Minutes to assign to current time");
console.log(end1.getMinutes() + minutesleft1); // Logs expected amount of minutes to calculate
end1.setMinutes(end1.getMinutes() + minutesleft1);
var end2 = new Date();
var minutesleft2 = "09";
console.log("Wrong Minutes to assign to current time");
console.log(end2.getMinutes() + minutesleft2); // Logs big number
end2.setMinutes(end2.getMinutes() + minutesleft2);
console.log(end1); // Logs expected result
console.log(end2); // Logs a time a day or so in the future
■
说明:如果你要你的启动定时器设置为9在分钟var中,它会立即需要用0填充以显示。既然你现在设置minutesleft
变量"09"
你实际上在做9 + "09"
当你调用end.setMinutes(end.getMinutes()+minutesleft);
一旦您将字符串"0"
的数目,您可以有效尝试做数字运算用字符串,这是造成意外的结果。这不是发生在一开始,因为您的if语句尚未运行,因此min
,sec
和msec
变量仍然是数字。 您只能在显示时填充数字,而不是在计算本身。
我用从this post借来的填充函数替换了字符串连接。
我还添加了一个播放功能来重置您的暂停参数。这使得代码更易读,更易于理解。另外,由于定时器尚未运行,请将其更改为在启动时暂停。
var minutesleft = 10;
var secondsleft = 05; // This would normally just be returned as 5, that's why we need the pad function for display
var millisecondsleft = 0;
var firstCall = true;
var paused = true;
var end;
var now;
function pause() {
paused = true;
}
function play() {
if (paused === false) // Shorcut out because we are already running
return;
paused = false;
cd();
}
function stop() {
end = now;
paused = true;
cd();
}
document.addEventListener("DOMContentLoaded", function(event) {
document.getElementById("cdtime").innerHTML = pad(minutesleft, 2) + ":" + pad(secondsleft, 2) + ":" + pad(millisecondsleft, 2);
});
function cd() {
if (firstCall) {
end = new Date();
end.setMinutes(end.getMinutes() + minutesleft);
end.setSeconds(end.getSeconds() + secondsleft);
end.setMilliseconds(end.getMilliseconds() + millisecondsleft);
firstCall = false;
}
now = new Date();
diff = end - now;
diff = new Date(diff);
var msec = diff.getMilliseconds();
var sec = diff.getSeconds();
var min = diff.getMinutes();
if (now >= end) {
clearTimeout(timerID);
document.getElementById("cdtime").innerHTML = 'POLICE IS HERE';
} else {
document.getElementById("cdtime").innerHTML = pad(min, 2) + ":" + pad(sec, 2) + ":" + pad(msec, 2);
}
if (paused === false) {
timerID = setTimeout("cd()", 10);
} else {
bool = true;
minutesleft = min;
secondsleft = sec;
millisecondsleft = msec;
}
}
function pad(n, width, z) {
z = z || '0';
n = n + '';
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}
<body>
<div id='timer'>
<button class='playerButtons' id='playT' type='submit' onclick='play()'>Play</button>
<button class='playerButtons' id='pauseT' type=' submit' onclick='pause()'>Pause</button>
<button class='playerButtons' id='stopT' type='submit' onclick='stop()'>Stop</button>
<div id='cdtime'></div>
</div>
</body>
什么是你的布尔变量实际上在做什么?考虑命名变量的描述性的东西,以帮助其他开发人员稍后调试您的代码......或在堆栈-o :) – Chizzle
对不起,我只是一个布尔值,可以帮助我知道如果这是第一次调用该函数或者自从我暂停以来的第一次 – LongDuZboub
我想我找到了字符串连接中的问题,并添加了0s – Chizzle