javascript - 如何让 setInterval 不像 for 循环
问题描述
所以这是我的秒表代码,它应该工作得很好,除非我测试它,它放弃了尝试实际计算时间,而是像在 for 循环中一样计数。您可以在这里亲自查看:
var currTime = 0
var origTime = 0
var timerFunc
var a = document.querySelector('#node1')
var i = 0
var md
var sd
var msd
function button1Action() {
if (i === 0) {
origTime = document.getElementById("time").value
currTime = document.getElementById("time").value
var b = a.cloneNode(true)
b.id = 'node2'
b.innerHTML = '<h1 id="text"></h1><button id="button1" class="button1" onclick="button1Action()">Start</button> <button id="button2" class="button2" onclick="button2Action()">Clear</button>'
a.parentNode.replaceChild(b, a)
let hd = Math.floor(currTime / 3600000)
let m = Math.floor((currTime % 3600000) / 60000)
let s = Math.floor((currTime % 60000) / 1000)
let ms = Math.floor(currTime % 1000)
if (m < 10) {
md = `0${m}`
} else {
md = `${m}`
}
if (s < 10) {
sd = `0${s}`
} else {
sd = `${s}`
}
if (ms < 10) {
msd = `00${ms}`
} else if (ms < 100) {
msd = `0${ms}`
} else {
msd = `${ms}`
}
document.getElementById("text").innerHTML = `${hd}:${md}:${sd}.${msd}`
} else if (i >= 1 && (i % 2) == 1) {
timerFunc = setInterval(function() {
currTime += 33
let hd = Math.floor(currTime / 3600000)
let m = Math.floor((currTime % 3600000) / 60000)
let s = Math.floor((currTime % 60000) / 1000)
let ms = Math.floor(currTime % 1000)
if (m < 10) {
md = `0${m}`
} else {
md = `${m}`
}
if (s < 10) {
sd = `0${s}`
} else {
sd = `${s}`
}
if (ms < 10) {
msd = `00${ms}`
} else if (ms < 100) {
msd = `0${ms}`
} else {
msd = `${ms}`
}
document.getElementById("text").innerHTML = `${hd}:${md}:${sd}.${msd}`
}, 33)
document.getElementById("button1").innerHTML = `Pause`
document.getElementById("button1").style.backgroundColor = "#0000ff"
} else if (i >= 1 && (i % 2) == 0) {
clearInterval(timerFunc)
document.getElementById("button1").innerHTML = `Cont..`
document.getElementById("button1").style.backgroundColor = "#00ff00"
} else {
throw "Error: i must be a positive integer or 0"
}
i++
}
function button2Action() {
clearInterval(timerFunc)
currTime = origTime
let hd = Math.floor(currTime / 3600000)
let m = Math.floor((currTime % 3600000) / 60000)
let s = Math.floor((currTime % 60000) / 1000)
let ms = Math.floor(currTime % 1000)
if (m < 10) {
md = `0${m}`
} else {
md = `${m}`
}
if (s < 10) {
sd = `0${s}`
} else {
sd = `${s}`
}
if (ms < 10) {
msd = `00${ms}`
} else if (ms < 100) {
msd = `0${ms}`
} else {
msd = `${ms}`
}
document.getElementById("text").innerHTML = `${hd}:${md}:${sd}.${msd}`
document.getElementById("button1").innerHTML = `Start`
document.getElementById("button1").style.backgroundColor = "#00ff00"
i = 1
}
.button1 {
background-color: #00ff00;
color: #999999;
}
.button2 {
background-color: #ff0000;
color: #eeeeee
}
.in1::placeholder {
color: #000e;
}
<!DOCTYPE html>
<html>
<head>
<title>Stopwatch</title>
</head>
<body id="node1">
<input type="number" class="in1" id="time" placeholder="0" value="0">
<br/><br/>
<button class="button1" onclick="button1Action()">Set</button>
</body>
</html>
我不知道为什么会这样。你能帮我么?
<h1>Thank you!</h1>
PS 这可能只是一个播放代码问题,所以如果您没有发现任何问题,请在下方评论,我会联系支持人员。
解决方案
问题是您没有将输入解析为数字。因此,当您这样做时currTime += 33;
,它是连接字符串而不是添加数字。parseInt()
在将输入读入变量时使用。
var currTime = 0
var origTime = 0
var timerFunc
var a = document.querySelector('#node1')
var i = 0
var md
var sd
var msd
var freq = 33;
function button1Action() {
if (i === 0) {
origTime = parseInt(document.getElementById("time").value)
currTime = parseInt(document.getElementById("time").value)
var b = a.cloneNode(true)
b.id = 'node2'
b.innerHTML = '<h1 id="text"></h1><button id="button1" class="button1" onclick="button1Action()">Start</button> <button id="button2" class="button2" onclick="button2Action()">Clear</button>'
a.parentNode.replaceChild(b, a)
let hd = Math.floor(currTime / 3600000)
let m = Math.floor((currTime % 3600000) / 60000)
let s = Math.floor((currTime % 60000) / 1000)
let ms = Math.floor(currTime % 1000)
if (m < 10) {
md = `0${m}`
} else {
md = `${m}`
}
if (s < 10) {
sd = `0${s}`
} else {
sd = `${s}`
}
if (ms < 10) {
msd = `00${ms}`
} else if (ms < 100) {
msd = `0${ms}`
} else {
msd = `${ms}`
}
document.getElementById("text").innerHTML = `${hd}:${md}:${sd}.${msd}`
} else if (i >= 1 && (i % 2) == 1) {
timerFunc = setInterval(function() {
currTime += freq
let hd = Math.floor(currTime / 3600000)
let m = Math.floor((currTime % 3600000) / 60000)
let s = Math.floor((currTime % 60000) / 1000)
let ms = Math.floor(currTime % 1000)
if (m < 10) {
md = `0${m}`
} else {
md = `${m}`
}
if (s < 10) {
sd = `0${s}`
} else {
sd = `${s}`
}
if (ms < 10) {
msd = `00${ms}`
} else if (ms < 100) {
msd = `0${ms}`
} else {
msd = `${ms}`
}
document.getElementById("text").innerHTML = `${hd}:${md}:${sd}.${msd}`
}, freq)
document.getElementById("button1").innerHTML = `Pause`
document.getElementById("button1").style.backgroundColor = "#0000ff"
} else if (i >= 1 && (i % 2) == 0) {
clearInterval(timerFunc)
document.getElementById("button1").innerHTML = `Cont..`
document.getElementById("button1").style.backgroundColor = "#00ff00"
} else {
throw "Error: i must be a positive integer or 0"
}
i++
}
function button2Action() {
clearInterval(timerFunc)
currTime = origTime
let hd = Math.floor(currTime / 3600000)
let m = Math.floor((currTime % 3600000) / 60000)
let s = Math.floor((currTime % 60000) / 1000)
let ms = Math.floor(currTime % 1000)
if (m < 10) {
md = `0${m}`
} else {
md = `${m}`
}
if (s < 10) {
sd = `0${s}`
} else {
sd = `${s}`
}
if (ms < 10) {
msd = `00${ms}`
} else if (ms < 100) {
msd = `0${ms}`
} else {
msd = `${ms}`
}
document.getElementById("text").innerHTML = `${hd}:${md}:${sd}.${msd}`
document.getElementById("button1").innerHTML = `Start`
document.getElementById("button1").style.backgroundColor = "#00ff00"
i = 1
}
.button1 {
background-color: #00ff00;
color: #999999;
}
.button2 {
background-color: #ff0000;
color: #eeeeee
}
.in1::placeholder {
color: #000e;
}
<!DOCTYPE html>
<html>
<head>
<title>Stopwatch</title>
</head>
<body id="node1">
<input type="number" class="in1" id="time" placeholder="0" value="0">
<br/><br/>
<button class="button1" onclick="button1Action()">Set</button>
</body>
</html>
推荐阅读
- python - 热切掉不同字符串中的文本?
- android - Gradle如何用'variant.getPackageLibraryProvider()'替换过时的'variantOutput.getPackageLibrary()'?
- python - 熊猫重命名索引
- react-select - React-select isMulti 在版本 1 中不起作用
- laravel - Laravel将数据插入两个不同的表
- c# - Xamarin iOS 向其他应用程序发送命令/事件
- java - 如何在Java中制作一个整数数组?
- node.js - 使用 Angular 和 NodeJS 通过 post 请求发送图像
- python - 从计划任务更新 SQLAlchemy 多行不起作用
- crystal-reports - 如何在水晶报表中选择最大值