Javascript 如何避免时钟计数器出现负值
我为测验模块制作了一个倒计时时钟,所以每当计数器结束时,我都会得到一个负值。在计时器结束后,我得到-1:-1,我希望它是00:00。 我原以为总时间会有错误,但我无法计算出错误 我试过这个逻辑,但不起作用Javascript 如何避免时钟计数器出现负值,javascript,jquery,Javascript,Jquery,我为测验模块制作了一个倒计时时钟,所以每当计数器结束时,我都会得到一个负值。在计时器结束后,我得到-1:-1,我希望它是00:00。 我原以为总时间会有错误,但我无法计算出错误 我试过这个逻辑,但不起作用 <script> function getTimeRemaining(endtime) { var t = Date.parse(endtime) - Date.parse(new Date()); var seconds = Math.floor((t / 100
<script>
function getTimeRemaining(endtime) {
var t = Date.parse(endtime) - Date.parse(new Date());
var seconds = Math.floor((t / 1000) % 60);
var minutes = Math.floor((t / 1000 / 60) % 60);
var hours = Math.floor((t / (1000 * 60 * 60)) % 24);
var days = Math.floor(t / (1000 * 60 * 60 * 24));
return {
'total': t,
'days': days,
'hours': hours,
'minutes': minutes,
'seconds': seconds
};
}
function initializeClock(id, endtime) {
var clock = document.getElementById(id);
var minutesSpan = clock.querySelector('.minutes');
var secondsSpan = clock.querySelector('.seconds');
function updateClock() {
var t = getTimeRemaining(endtime);
minutesSpan.innerHTML = ('0' + t.minutes).slice(-2);
secondsSpan.innerHTML = ('0' + t.seconds).slice(-2);
if($('.minutes').text() == '00' && $('.seconds').text() == '00')
{
if(score == 0)
{
// Wrap every letter in a span
document.getElementById("congrats").innerHTML = "Better Luck Next time"; //When all the words are solved, greeting is displayed
document.getElementById("part1").hidden = false;
document.getElementById("goodjob").hidden = false;
document.getElementById("part2").hidden = false;
document.getElementById("button5").disabled = true;
document.getElementById("totscore").innerHTML = "Total correct answer " + score;
document.getElementById("totcoins").innerHTML = "Total coins achieved " + score;
document.getElementById("coins").hidden = false;
document.getElementById("my_audio").pause();
setTimeout(function(){
document.getElementById("drop").play();
}, 1000)
}
else if(score == 5){
document.getElementById("congrats").innerHTML = "Congratulations You solved all three piece words"; //When all the words are solved, greeting is displayed
document.getElementById("part1").hidden = false;
document.getElementById("goodjob").hidden = false;
document.getElementById("part2").hidden = false;
document.getElementById("totscore").innerHTML = "Total correct answer " + score;
document.getElementById("totcoins").innerHTML = "Total coins achieved " + score;
document.getElementById("coins").hidden = false;
document.getElementById("my_audio").pause();
setTimeout(function(){
document.getElementById("drop").play();
}, 1000)
}
}
if (t.total <= 0) {
clearInterval(timeinterval);
}
}
updateClock();
var timeinterval = setInterval(updateClock, 1000);
}
var deadline = new Date(Date.parse(new Date()) + 20 * 1000);
initializeClock('clockdiv', deadline);
</script>
函数getTimeRemaining(endtime){
var t=Date.parse(endtime)-Date.parse(new Date());
var秒=数学地板((t/1000)%60);
var分钟=数学地板((t/1000/60)%60);
可变小时数=数学楼层((t/(1000*60*60))%24);
风险天数=数学下限(t/(1000*60*60*24));
返回{
“总计”:t,
“天”:天,
“小时”:小时,
“分钟”:分钟,
“秒”:秒
};
}
函数初始化锁(id,endtime){
var clock=document.getElementById(id);
var minutesSpan=clock.querySelector('.minutes');
var secondsSpan=clock.querySelector('.seconds');
函数updatelock(){
var t=GetTime剩余时间(endtime);
minuteSpan.innerHTML=('0'+t.minutes).slice(-2);
secondsSpan.innerHTML=('0'+t.seconds).slice(-2);
如果($('.minutes').text()='00'&&($('.seconds').text()='00')
{
如果(分数=0)
{
//把每一封信都包在一个空格里
document.getElementById(“恭喜”).innerHTML=“祝你下次好运”;//当所有单词都解决后,将显示问候语
document.getElementById(“part1”).hidden=false;
document.getElementById(“goodjob”).hidden=false;
document.getElementById(“part2”).hidden=false;
document.getElementById(“button5”).disabled=true;
document.getElementById(“totscore”).innerHTML=“总正确答案”+分数;
document.getElementById(“totcoins”).innerHTML=“获得的硬币总数”+分数;
document.getElementById(“coins”).hidden=false;
document.getElementById(“my_audio”).pause();
setTimeout(函数(){
document.getElementById(“drop”).play();
}, 1000)
}
否则如果(分数=5){
document.getElementById(“恭喜”).innerHTML=“恭喜你解决了所有三个单词”;//解决了所有单词后,将显示问候语
document.getElementById(“part1”).hidden=false;
document.getElementById(“goodjob”).hidden=false;
document.getElementById(“part2”).hidden=false;
document.getElementById(“totscore”).innerHTML=“总正确答案”+分数;
document.getElementById(“totcoins”).innerHTML=“获得的硬币总数”+分数;
document.getElementById(“coins”).hidden=false;
document.getElementById(“my_audio”).pause();
setTimeout(函数(){
document.getElementById(“drop”).play();
}, 1000)
}
}
如果(t.total您的函数在达到0后再次运行,从而导致-1
通过在函数中进行检查以获取剩余时间,可以快速修复此问题:
function getTimeRemaining(endtime) {
var t = Date.parse(endtime) - Date.parse(new Date());
var seconds = Math.floor((t / 1000) % 60);
var minutes = Math.floor((t / 1000 / 60) % 60);
var hours = Math.floor((t / (1000 * 60 * 60)) % 24);
var days = Math.floor(t / (1000 * 60 * 60 * 24));
minutes = minutes < 0? 0 : minutes; //Check if they are lower than 0, if yes, set them to 0
seconds = seconds < 0? 0 : seconds;
return {
'total': t,
'days': days,
'hours': hours,
'minutes': minutes,
'seconds': seconds
};
}
函数getTimeRemaining(endtime){
var t=Date.parse(endtime)-Date.parse(new Date());
var秒=数学地板((t/1000)%60);
var分钟=数学地板((t/1000/60)%60);
可变小时数=数学楼层((t/(1000*60*60))%24);
风险天数=数学下限(t/(1000*60*60*24));
分钟数=分钟数<0?0:minutes;//检查它们是否小于0,如果是,则将它们设置为0
秒=秒<0?0:秒;
返回{
“总计”:t,
“天”:天,
“小时”:小时,
“分钟”:分钟,
“秒”:秒
};
}
首先,不要使用html中输入的字符串来验证数字,使用实际数字。我指的是
if($('.minutes').text() == '00' && $('.seconds').text() == '00')
避免这样做
您在从getTimeRemaining
返回的对象中放置了一个值,该值表示日期之间以毫秒为单位的实际差异。为什么不使用该值呢
if (t.total <= 0) {
...
}
我对否决票很好奇。我说错了什么?我没有否决票,但以下是我的一些发现:您不需要将其转换为数字$('.minutes')。text()
&$('.seconds')。text()
保留格式化的数字。作者可能想要区分“00”
和“0”
。第二个参数有点错误-它是毫秒数的差异。作者可能只想检查秒数,而不是毫秒数。第三件事是你的第三行给代码增加了额外的容量。另外,一般来说,你没有回答发生了什么,因此它会导致-1
。我没有说你必须这样做换成数字,我说把它转换成文本,然后用文本检查它不是零(或更少)是没有意义的.只要检查一下数字。我不确定你所说的毫秒差是什么意思。如果它是零或低于零,它们是秒还是毫秒都无关紧要。时间已经到了。而且我也不确定我的第三行是什么增加了代码的容量。你能指出它吗?如果你指的是If
条件,我只是从函数的底部删除了它。他在哪里将它转换为文本?至少在你引用的代码段中没有。我的意思是从Date.parse(…)-Date.parse(…)给出的差异
以毫秒为单位,而不是以秒为单位。尽管这可能没有什么区别,但您提供了错误的信息,在某些边缘情况下,它可能会产生错误的信息。对于批量,我指的是复制minutespan.innerHTML
部分。虽然没有错,也不是什么大问题,但有些人可能不喜欢它。另外,请注意,我并不是在尝试复制它我想你的答案本身并没有错。我只是想帮你指出它的缺点。别担心,我很感激你的评论。无论如何,转换成字符串
if (t.total <= 0) {
...
}
function updateClock() {
var t = getTimeRemaining(endtime);
if (t.total <= 0) {
clearInterval(timeinterval);
minutesSpan.innerHTML = '00';
secondsSpan.innerHTML = '00';
if(score == 0) {
...
}
....
} else {
minutesSpan.innerHTML = ('0' + t.minutes).slice(-2);
secondsSpan.innerHTML = ('0' + t.seconds).slice(-2);
}
}