为了账号安全,请及时绑定邮箱和手机立即绑定

停止setTImeout()函数刷新倒计时

停止setTImeout()函数刷新倒计时

森栏 2023-08-18 17:11:58
我有一个 javascript 倒计时功能,运行良好。但我不知道如何停止并刷新计时器以延长时间。当我在超时之前再次调用这个函数时,它的工作方式非常奇怪。它显示了两个倒计时时间,因为 updateTimer() 函数仍在工作。于是我上网查了一下,发现clearTimeout()函数可以停止这个倒计时。但我不知道如何应用这个功能。请帮助我停止并刷新这个计时器。function countdown(elementName, minutes, seconds) {    var element, endTime, hours, mins, msLeft, time;    function twoDigits(n) {        return (n <= 9 ? "0" + n : n);    }    function updateTimer() {        msLeft = endTime - (+new Date);        if (msLeft < 1000) {            element.innerHTML = "00:00";        } else {            time = new Date(msLeft);            hours = time.getUTCHours();            mins = time.getUTCMinutes();            element.innerHTML = twoDigits(time.getUTCMinutes()) + ':' + twoDigits(time.getUTCSeconds());            setTimeout(updateTimer, time.getUTCMilliseconds() + 500);        }    }    element = document.getElementById(elementName);    endTime = (+new Date) + 1000 * (60 * minutes + seconds) + 500;    updateTimer();    return stopTimer();}countdown("countdown", 0, 30);
查看完整描述

2 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您需要将您的存储setTimeout()在变量中。匿名超时无法清除。


var timeout;


function countdown(elementName, minutes, seconds) {

    var element, endTime, hours, mins, msLeft, time;



    function twoDigits(n) {

        return (n <= 9 ? "0" + n : n);

    }


    function updateTimer() {

        msLeft = endTime - (+new Date);

        if (msLeft < 1000) {

            element.innerHTML = "00:00";

        } else {

            time = new Date(msLeft);

            hours = time.getUTCHours();

            mins = time.getUTCMinutes();

            element.innerHTML = twoDigits(time.getUTCMinutes()) + ':' + twoDigits(time.getUTCSeconds());

            timeout = setTimeout(updateTimer, time.getUTCMilliseconds() + 500);

        }

    }


    element = document.getElementById(elementName);

    endTime = (+new Date) + 1000 * (60 * minutes + seconds) + 500;

    updateTimer();


    stopTimer();

}


function stopTimer() {

  clearTimeout(timeout);

}


countdown("countdown", 0, 30);


查看完整回答
反对 回复 2023-08-18
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

您需要设置一个全局变量等于 的返回值setTimeout(...),然后将该全局变量传递给clearTimeout()func。

就是这样:


let tm;



function countdown(elementName, minutes, seconds) {

    var element, endTime, hours, mins, msLeft, time;

    



    function twoDigits(n) {

        return (n <= 9 ? "0" + n : n);

    }


    function stopTimer(t) {

        return clearTimeout(t);

    }


    function updateTimer() {

        msLeft = endTime - (+new Date);

        if (msLeft < 1000) {

            element.innerHTML = "00:00";

        } else {

            time = new Date(msLeft);

            hours = time.getUTCHours();

            mins = time.getUTCMinutes();

            element.innerHTML = twoDigits(time.getUTCMinutes()) + ':' + twoDigits(time.getUTCSeconds());

            tm = setTimeout(updateTimer, time.getUTCMilliseconds() + 500);

        }

    }


    element = document.getElementById(elementName);

    endTime = (+new Date) + 1000 * (60 * minutes + seconds) + 500;

    updateTimer();


    return stopTimer(tm);

}


countdown("countdown", 0, 30);


查看完整回答
反对 回复 2023-08-18
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信