javascript - 为什么 clearInterval 不适用于这个时钟?
问题描述
我正在尝试创建一个番茄钟,但我无法弄清楚为什么 resetClock 函数除了清除时钟的间隔之外一切正常。它正在重置数字,但时钟一直在倒计时。我想我在尝试实现停止时钟功能时也会遇到这个问题。有人可以帮忙吗?
var minutes = 25;
var seconds = 0;
var startSound = new Audio('./sounds/startsound.mp3')
var resetSound = new Audio('./sounds/resetclocksound.mp3')
var stopSound = new Audio('./sounds/pausesound.mp3')
var alarmSound = new Audio('/sounds//haoduken.mp3')
var minutes_interval;
var seconds_interval;
function startClock() {
startSound.play();
minutes = 24;
seconds = 59;
document.getElementById('minutes').innerHTML = minutes;
document.getElementById('seconds').innerHTML = seconds;
document.getElementById('start-button').removeEventListener('click', startClock)
var minutes_interval = setInterval(minutesTimer, 60000);
var seconds_interval = setInterval(secondsTimer, 1000);
function minutesTimer() {
minutes = minutes - 1;
document.getElementById('minutes').innerHTML = minutes;
}
function secondsTimer() {
seconds = seconds - 1;
document.getElementById('seconds').innerHTML = seconds;
if (seconds <= 0) {
seconds = 60;
}
if (seconds <= 0 && minutes <= 0) {
alarmSound.play()
clearInterval(minutes_interval);
clearInterval(seconds_interval);
}
}
}
function resetClock() {
clearInterval(seconds_interval);
clearInterval(minutes_interval)
resetSound.play();
var minutes = 25;
var seconds = 0;
document.getElementById('minutes').innerHTML = minutes;
document.getElementById('seconds').innerHTML = seconds;
document.getElementById('start-button').addEventListener('click', startClock)
}
解决方案
问题在于您开始间隔的行:
var minutes_interval = setInterval(minutesTimer, 60000);
var seconds_interval = setInterval(secondsTimer, 1000);
问题只是您使用了var
关键字,它在函数内部创建了一个新的局部变量。startClock
它对同名的外部(全局?)变量没有任何作用,因为它们被新的局部变量“遮蔽”了。
因此,clearInterval
内部调用resetClock
引用了外部变量,这些变量不包含计时器 ID。
解决方案可能很简单:只需var
从上面两行中删除。您现在只有一个“全局” minutes_interval
and ,调用seconds_interval
将引用它。clearInterval
一眼看去,这似乎对您来说应该没问题,并且您在取消它们之前只设置了一次这些间隔。但是,如果您想使用此代码同时设置多个间隔,则必须重新考虑您的方法。
推荐阅读
- html - Podium CSS:将元素定位在其 div 的底部
- java - 如何计算这个类的hashCode
- python - 坐标图的刻度轴刻度标签
- sql - 为环境创建角色
- protractor - 我们可以使用 JSON 文件进行参数化测试吗?
- powershell - 如何从 powershell 脚本手动安装 powershell 模块
- html - 如何在动态表中 xpath 值?
- javascript - 可以通过 websocket 发送音频文件吗?
- javascript - 在 Javascript 中覆盖文件输入对话框
- c# - Livecharts:缩放到 CartesianChart 中的特定区域