【问题标题】:Countdown timer does not stop倒计时不停止
【发布时间】:2013-07-05 23:15:23
【问题描述】:

如果在 10 秒之前给出答案,我需要一个停止功能。我尝试了一些想法,但找不到解决方案

这是updated jsFiddle 和我的代码。有人可以帮忙吗?

HTML

<canvas id="timer" width="48" height="48"></canvas>
<span id="num"></span>

<br /><br />
<a href="javascript:istop();">stop</a>

JAVASCRIPT

function sCounter(){
    canvas = document.getElementById('timer');
    num = document.getElementById('num');
    ctx = canvas.getContext('2d');
    fps= 40;

    var total = fps*10; //*second
    for(var i=total;i>=0;i--) {
        var delayed = (function(){
            var step = 1-i/total;
            var left = Math.ceil(i/fps);
            return function() {
                num.innerHTML=left;
                draw_next(step);

                if(left===0){  //if 0
                    //etc...
                }
            };
        })();
        var timer = setTimeout(delayed,-1000/fps*(i-total));
    }
}

function draw_next(step) {
    ctx.clearRect(0,0,48,48);
    ctx.beginPath();
    ctx.arc(24,24,20,Math.PI * (-0.5 + 0),Math.PI * (-0.5 + step*2),false);
    ctx.lineWidth = 8;
    ctx.strokeStyle = "#dedede";
    ctx.stroke();
}

function istop(e) {
    e.preventDefault();
    var timer = null;
    clearTimeout(timer);
    return false;
}

sCounter();

【问题讨论】:

    标签: javascript html canvas drawing


    【解决方案1】:

    您应该将 timer var 放在一个公共范围内,似乎 for 循环正在激活计时器而前一个没有结束,因此您无法清除它们,请参阅 de fiddle:http://jsfiddle.net/HQJkz/

        var timer = null
    
        function sCounter() {
        canvas = document.getElementById('timer');
        num = document.getElementById('num');
        ctx = canvas.getContext('2d');
        fps = 40;
    
        var total = fps * 10; //*second
    
        var render = function (left, step, i) {
            num.innerHTML = left;
            draw_next(step);
            if (left)
            if (left === 0) { //if 0
                //etc...
            } else {
                delayed(i - 1);
            }
        };
    
        var delayed = function (i) {
            var step = 1 - i / total;
            var left = Math.ceil(i / fps);
            var current = function () {
                console.log(left, step);
                render(left, step, i);
            };
            timer = setTimeout(current, -1000 / fps * (i - total));
        }
    
        delayed(total - 1);
    }
    

    而且您似乎在失去价值后试图清除计时器。我不得不将 istop 范围更改为 window 因为 fiddle 没有找到它。这应该可以解决问题:

    window.istop = function() {
        clearTimeout(timer);
        timer = null;
        return false;
    }
    

    【讨论】:

    • 好的,它覆盖了计时器,你应该只在最后一个完成后启动 setTimeout。
    • 执行 for() 您需要 40 个计时器。最好的方法是在当前计时器被触发时触发下一个计时器。
    • 对不起,如果可以在 jsFiddle 上为我编辑,我的代码经验不足以编辑脚本。谢谢所有答案。
    • 我必须先结束一些事情。你能等5个小时吗?
    • 很抱歉我忘记了这一点,我在小提琴上做了一个叉子,这个版本成功停止,但你必须修复时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多