首页 > 解决方案 > 通过javascript将按钮元素更新为倒数计时器

问题描述

我想创建一个倒数计时器,它看起来像网页的 fps 计数器......经过数小时的时间,我无法找出问题所在......帮助

<script>
    var myvar = setInterval(function () { startTimer() }, 1000);

    function startTimer() {
        var presentTime = 17 + ":" + 00;
        var timeArray = presentTime.split(/[:]+/);
        var m = timeArray[0];
        var s = checkSecond((timeArray[1] - 1));
        if (s == 59) {
            m = m - 1
        }
        //if(m<0){alert('timer completed')}

        var button2 = document.createElement("Button2");
        var interval = m + s;
        button2.innerHTML = Math.round(interval);

        button2.style = "top:0; left:0rem; height:10% ;color: black; background-color: #ffffff;position:fixed;padding:20px;font-size:large;font-weight: bold;";

        setTimeout(startTimer, 1000);
        document.body.appendChild(button2);
    }

    function checkSecond(sec) {
        if (sec < 10 && sec >= 0) {
            sec = "0" + sec
        }; // add zero in front of numbers < 10
        if (sec < 0) {
            sec = "59"
        };
        return sec;
    }
</script>

标签: javascripttimerelementsetintervalcountdowntimer

解决方案


我可以找到三个阻碍您的代码正确执行的错误。

多个定时器

首先,因为您setInterval在外部范围内调用 a ,然后setTimeout在每次执行迭代后调用 a ,您最终会得到许多不需要的计时器实例,这些实例将为您做一些疯狂的计数。

我建议您废弃其中任何一种,只使用其中一种。对于我的示例,我碰巧坚持使用,setInterval因为您一遍又一遍地执行相同的方法。

初始化

由于在-functionpresentTime内部声明了startTimer,它将不断被覆盖17 + ":" + 00(导致"17:0"顺便说一句)。这可以通过在外部范围内声明它来解决。

记住变化

最后你需要保存presentTime修改后的当前状态。只需presentTime = [m,s].join(":");在末尾添加 astartTimer()即可解决此问题。

var presentTime = "17:00";

function startTimer() {
    var timeArray = presentTime.split(/[:]+/);
    var m = timeArray[0];
    var s = checkSecond((timeArray[1] - 1));
    if (s == 59) {
        m = m - 1
    }

    var button2 = document.createElement("Button2");
    var interval = s;
    button2.innerHTML = m + ":" + s;

    button2.style = "top:0; left:0rem; height:10% ;color: black; background-color: #ffffff;position:fixed;padding:20px;font-size:large;font-weight: bold;";

    document.body.appendChild(button2);
    presentTime = [m,s].join(":");
}

function checkSecond(sec) {
    if (sec < 10 && sec >= 0) {
        sec = "0" + sec
    }; // add zero in front of numbers < 10
    if (sec < 0) {
        sec = "59"
    };
    return sec;
}

var interval = setInterval(startTimer, 1000);

推荐阅读