-2

我的问题是计时器没有正确暂停。当我点击暂停时,它看起来已经停止但实际上它继续循环,当我点击开始时,它不会从我暂停的地方继续,而是从它到达的位置继续。

<div class="stopwatch">
    <span>00:00:00,000</span><br />
    <div class="btn start">play</div>
    <div class="btn pause">pause</div>
    <div class="btn reset">reset</div>
</div>
$(function (){  
    var reload = 1000/60;  
    var timer = null;  
    var startTime = 0;  
    var btn = $('.stopwatch a');  
    var count = $('.stopwatch span');  
    var pause = false;

    $('.pause').click(function (){
        pause = true; 
    });
    $('.start').click(function (){
        pause = false; 
    });
    $('.reset').click(function (){
        return ( (count.text('00:00:00,000')) && (timer = 0) );
    });

    function zero(num, length) {  
        if ( typeof(length) == 'undefined' ) length = 2;  

        while ( num.toString().length < length ) {  
            num = '0' + num;  
        }  
        return num;  
    }  

    function zero_format(time){  
        return zero(time.getUTCHours()) + ':' + zero(time.getMinutes()) + ':' + zero(time.getSeconds()) + ',' + zero(time.getMilliseconds()); 
    }  

    $('.start').click( function (){  
        if ( !timer ){  
            startTime = new Date();  
            timer = setInterval( function (){  
                if ( pause ){
                    return;
                }

                var currentTime = new Date(new Date() - startTime);  
                count.text(zero_format(currentTime));  
            }, reload);
        }
        return false;
    });
});   
4

3 回答 3

1

您需要调整 startTime 变量,因为您仍在计算与第一次按下 start 时创建的 datetime 的时间差异

于 2013-01-15T13:45:54.567 回答
0

你有两个处理程序$('.start')

试试这个:现场演示

$('.start').click(function (){  
    if ( !timer ){  
        startTime = new Date();  
        timer = setInterval( function (){  
            if ( pause ){
                return;
            }

            var currentTime = new Date(new Date() - startTime);  
            count.text(zero_format(currentTime));  
        }, reload);
    } else {
        pause = false; 
    }

    return false;
});

删除这个:

$('.start').click(function (){
    pause = false; 
});

更新 1

如果您需要秒表,而不是单圈计时器,那么这里是代码:现场演示

var savedTime;
var additional = 0;

$('.pause').click(function (){
    savedTime = new Date(); 
    pause = true; 
});

$('.reset').click(function (){
    count.text('00:00:00,000');
    clearInterval(timer);
    timer = null;
    additional = 0;
});

$('.start').click( function (){  
    if ( !timer ){  
              startTime = new Date();  
        timer = setInterval( function (){  
            if ( pause ){
                return;
            }

            currentTime = new Date(new Date() - startTime - additional);  
            count.text(zero_format(currentTime));  
        }, reload);

        pause = false;
    }

    if(pause == true) {
        additional += new Date() - savedTime;
        pause = false; 
    }

   return false;
});
于 2013-01-15T13:46:45.403 回答
0

我会提升currentTime到外部范围并跟踪外部范围中最后一次滴答的时间。然后在每个滴答声中,currentTime通过添加最后一个滴答声和当前滴答声之间的差异来更新,而不是自开始以来的时间。这样它就会被适当地暂停。

此外,您还需要currentTime在第一次暂停时添加并在重新启动时重置最后一个刻度。

于 2013-01-15T13:51:17.367 回答