javascript - Javascript开始/停止按钮更改innerHTML并启动计时器,但不履行任何其他部分功能
问题描述
我有一个按钮,我试图将其用作启动或停止倒数计时器的事件的开始和停止。但是,它目前仅启动并更改为停止,但不会更改回开始或停止计时器倒计时。
有没有更好的方法来做到这一点?我还包括了重置按钮,因为我试图在按下它时重置它,但它目前只是变回开始,但在我完成此操作后开始不会再次触发。
((d) => {
let btn = d.getElementById("btn");
let reset = d.getElementById("reset");
let countdown = d.getElementById("countdown");
let counter;
let startTime = 1500;
let timerFormat = (s) => {
return (s - (s %= 60)) / 60 + (9 < s ? ":" : ":0") + s;
};
countdown.innerHTML = timerFormat(startTime);
let timer = () => {
startTime--;
countdown.innerHTML = timerFormat(startTime);
if (startTime === 0) clearInterval(counter);
};
btn.addEventListener("click", () => {
if (stop) {
start();
btn.innerHTML = "Stop";
} else {
stop();
btn.innerHTML = "Start";
}
});
let start = () => {
counter = counter || setInterval(timer, 1000);
};
let stop = () => {
clearInterval(counter);
counter = undefined;
};
reset.onclick = () => {
startTime = 1500;
countdown.innerHTML = timerFormat(startTime);
if (btn.innerHTML === "Stop") {
btn.innerHTML = "Start";
}
};
})(document);
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="../styles/styles.css" />
<script defer src="../JS/timer.js"></script>
</head>
<body>
<div id="countdown"></div>
<div class="btn__container">
<button class="btn" id="btn">Start</button>
<button class="btn" id="reset">Reset</button>
</div>
</body>
</html>
解决方案
您的问题在于如何确定是开始还是停止:
if (stop) {
stop
是一个函数,因此它具有“真实”值,并且您的if
语句将始终评估为true
. 相反,请检查counter
.
其他:
- 如果您能提供帮助,请不要使用
.innerHTML
它,当然,当您使用的字符串不包含任何 HTML 时也不要使用。.innerHTML
具有安全性和性能影响。相反,使用.textContent
. - 虽然计时器不会 100% 准确计时,但您可以通过让回调每秒运行一点点来使计数器更准确一点。原因是每秒运行一次意味着如果计时器在一秒钟后没有运行,您可能会在计数器上跳过一秒钟。
((d) => {
let btn = d.getElementById("btn");
let reset = d.getElementById("reset");
let countdown = d.getElementById("countdown");
let counter;
let startTime = 1500;
let timerFormat = (s) => {
return (s - (s %= 60)) / 60 + (9 < s ? ":" : ":0") + s;
};
countdown.textContent = timerFormat(startTime);
let timer = () => {
startTime--;
countdown.textContent = timerFormat(startTime);
if (startTime === 0) clearInterval(counter);
};
btn.addEventListener("click", () => {
if (counter) {
stop();
btn.textContent = "Start";
} else {
start();
btn.textContent = "Stop";
}
});
let start = () => {
counter = counter || setInterval(timer, 950);
};
let stop = () => {
clearInterval(counter);
counter = null;
};
reset.onclick = () => {
startTime = 1500;
countdown.textContent = timerFormat(startTime);
if (btn.textContent === "Stop") {
btn.textContent = "Start";
}
};
})(document);
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="../styles/styles.css" />
<script defer src="../JS/timer.js"></script>
</head>
<body>
<div id="countdown"></div>
<div class="btn__container">
<button class="btn" id="btn">Start</button>
<button class="btn" id="reset">Reset</button>
</div>
</body>
</html>
推荐阅读
- ethereum - Solidity ERC-721 错误:返回错误:执行已恢复
- swift - PHImageManager 请求精确大小的图像并不总是有效
- postgresql - 如何使用 database-rider 将 DataSet 插入表中,其列定义为 GENERATED ALWAYS?
- python - 如何从 Pandas DF 中删除特殊字符?
- windows - 使用 Golang 进行 DLL 注入(CreateRemoteThread)
- r - 使用前 n 个非 NA 元素创建新数据框
- xcode - Xcode 11.3.1 运行 iOS 14.5.1 应用程序错误无法从该设备复制符号
- python - 如何在协方差较弱的多元数据中找出异常值
- sql - SQL Server:OPENJSON 错误,动态 JSON 列存储在数据库表中
- r - 在集群协方差测试中指定更复杂的随机效应结构(在基于模型的递归分区中)?(例如,MOB、glmertree 等)