Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何避免时钟计数器出现负值_Javascript_Jquery - Fatal编程技术网

Javascript 如何避免时钟计数器出现负值

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

我为测验模块制作了一个倒计时时钟,所以每当计数器结束时,我都会得到一个负值。在计时器结束后,我得到-1:-1,我希望它是00:00。 我原以为总时间会有错误,但我无法计算出错误

我试过这个逻辑,但不起作用

<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);
    }
}