JS getter 和间隔在倒数计时器中无法正常工作
JS getter and intervals not working properly in countdown timer
为了理解这个理论是如何运作的,我们的想法是创建一个带有分钟和秒的倒计时,一个 btn 到 start/continue 另一个暂停。
第一次启动需要减1分钟。 (速度和秒数发生变化,因此速度更快,无论如何它应该工作相同) 根据我的阅读,这可以通过对象内部的 getter 来完成检测时间是否等于初始时间,如果是,则进行更改。在这种情况下,如何将原始 var min 值从 3 更改为 2 而不是在对象内部创建新的 var?
部分有效,现在的问题是:按Start后,如果在开始倒计时时按Pause,再按Start继续,显示undefined而不是2。为什么这个值丢失了?如何防止这种情况?另外,暂停和恢复后,分钟和秒的间隔不同步。
这个 1 分钟的变化也会导致当到达最后一分钟时,秒数跳到 0,而不是一个接一个地下降,直到达到 0。
整个倒计时可以用更优雅的方式重建,但我只是不明白为什么它不能像现在这样工作背后的逻辑,也不知道如何解决这个问题。
如有任何帮助,我们将不胜感激。谢谢!
var initialmin = 3;
var min = 3;
var sec = 20;
//Display initial time
document.getElementById("min").innerHTML = initialmin;
if (sec = 20) {
document.getElementById("sec").innerHTML = "00";
}
//subtract 1 min when countdown starts the first time
//How to change value of var min instead of creating timeleft.minleft?
timeleft = {
get minleft() {
if ((min == initialmin) && (sec == 20)) {
console.log("first start: rest 1 min");
return min = min - 1;
}
}
} //end timeleft
function start() {
//Change 00 seconds placeholder with current seconds
document.getElementById("sec").innerHTML = sec;
//show 1 less minute than initial min
document.getElementById("min").innerHTML = timeleft.minleft;
//subtract minutes every 20sec
subtractminutes = setInterval(function() {
min -= 1;
document.getElementById("min").textContent = min;
console.log(min);
//when reach 0 minutes, stop subtracting minutes
if (min == 0) {
console.log("min done");
clearInterval(subtractminutes);
}
}, 2000);
subtractseconds = setInterval(function() {
//restart 20sec countdown if there are still minutes left
sec--;
document.getElementById("sec").textContent = sec;
if ((min >= 1) && (sec == 0))
sec += 20;
//when last min is reached, stop counting seconds once reached 0
if ((min == 0) && (sec == 0)) {
console.log("sec done");
clearInterval(subtractseconds);
}
}, 100);
}
function stop() {
clearInterval(subtractseconds);
clearInterval(subtractminutes);
}
<div id="controls">
<button id="start" onclick="start()">Start</button>
<button id="stop" onclick="stop()">Stop</button>
</div>
<p id="min"></p>
<p id="sec"></p>
当你重新启动计时器时,你在getter方法中的条件是false
,默认情况下是returnundefined
。
timeleft = {
get minleft() {
if ((min == initialmin) && (sec == 20)) { // condition here is false
console.log("first start: rest 1 min");
return min = min - 1;
}
// return undefined by default
}
}
为了理解这个理论是如何运作的,我们的想法是创建一个带有分钟和秒的倒计时,一个 btn 到 start/continue 另一个暂停。
第一次启动需要减1分钟。 (速度和秒数发生变化,因此速度更快,无论如何它应该工作相同) 根据我的阅读,这可以通过对象内部的 getter 来完成检测时间是否等于初始时间,如果是,则进行更改。在这种情况下,如何将原始 var min 值从 3 更改为 2 而不是在对象内部创建新的 var?
部分有效,现在的问题是:按Start后,如果在开始倒计时时按Pause,再按Start继续,显示undefined而不是2。为什么这个值丢失了?如何防止这种情况?另外,暂停和恢复后,分钟和秒的间隔不同步。
这个 1 分钟的变化也会导致当到达最后一分钟时,秒数跳到 0,而不是一个接一个地下降,直到达到 0。
整个倒计时可以用更优雅的方式重建,但我只是不明白为什么它不能像现在这样工作背后的逻辑,也不知道如何解决这个问题。
如有任何帮助,我们将不胜感激。谢谢!
var initialmin = 3;
var min = 3;
var sec = 20;
//Display initial time
document.getElementById("min").innerHTML = initialmin;
if (sec = 20) {
document.getElementById("sec").innerHTML = "00";
}
//subtract 1 min when countdown starts the first time
//How to change value of var min instead of creating timeleft.minleft?
timeleft = {
get minleft() {
if ((min == initialmin) && (sec == 20)) {
console.log("first start: rest 1 min");
return min = min - 1;
}
}
} //end timeleft
function start() {
//Change 00 seconds placeholder with current seconds
document.getElementById("sec").innerHTML = sec;
//show 1 less minute than initial min
document.getElementById("min").innerHTML = timeleft.minleft;
//subtract minutes every 20sec
subtractminutes = setInterval(function() {
min -= 1;
document.getElementById("min").textContent = min;
console.log(min);
//when reach 0 minutes, stop subtracting minutes
if (min == 0) {
console.log("min done");
clearInterval(subtractminutes);
}
}, 2000);
subtractseconds = setInterval(function() {
//restart 20sec countdown if there are still minutes left
sec--;
document.getElementById("sec").textContent = sec;
if ((min >= 1) && (sec == 0))
sec += 20;
//when last min is reached, stop counting seconds once reached 0
if ((min == 0) && (sec == 0)) {
console.log("sec done");
clearInterval(subtractseconds);
}
}, 100);
}
function stop() {
clearInterval(subtractseconds);
clearInterval(subtractminutes);
}
<div id="controls">
<button id="start" onclick="start()">Start</button>
<button id="stop" onclick="stop()">Stop</button>
</div>
<p id="min"></p>
<p id="sec"></p>
当你重新启动计时器时,你在getter方法中的条件是false
,默认情况下是returnundefined
。
timeleft = {
get minleft() {
if ((min == initialmin) && (sec == 20)) { // condition here is false
console.log("first start: rest 1 min");
return min = min - 1;
}
// return undefined by default
}
}