SetTimeout 在警报时暂停

问题描述 投票:0回答:2

我必须在我的网页上显示计时器。我正在使用 Javascript SetTimeout 方法来执行此操作。 我的代码是这样的:

function UpdateTimer() {
        var hfTimer = $('#<%= hfTimer.ClientID %>');
        $('#spnTimer').html(GetElapsedTime(hfTimer.val()));
        hfTimer.val(parseInt(hfTimer.val(), 10) + 1);
        setTimeout(UpdateTimer, 1000);
    }

    function GetElapsedTime(seconds) {
        var sec_num = parseInt(seconds, 10);
        var hours = Math.floor(sec_num / 3600);
        var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
        var seconds = sec_num - (hours * 3600) - (minutes * 60);

        if (hours < 10) { hours = "0" + hours; }
        if (minutes < 10) { minutes = "0" + minutes; }
        if (seconds < 10) { seconds = "0" + seconds; }
        var time = hours + ':' + minutes + ':' + seconds;
        return time;
    }

计时器工作正常,直到弹出一些警报。警报可以是简单的 jquery 警报,有时也可以是验证摘要警报。当此警报出现时,计时器暂停,当我单击“确定”时,计时器再次开始运行。 我不希望这种停顿发生。 有什么办法解决这个问题吗?请帮助我。

javascript jquery timer
2个回答
1
投票

我认为您无法采取任何措施来真正避免暂停,但您可以确保您的计时器在暂停后恢复

var timer;

$(function () {
    $('#messThingsUp').click(function () {
        alert('timer stops...');
    });
    $('#datestamp').val(new Date().getTime());
    timer = setInterval(UpdateTimer, 200);
});

function UpdateTimer() {
    var hfTimer = $('#hfTimer');
    var before = $('#datestamp').val();
    var now = new Date().getTime();
    $('#spnTimer').html(GetElapsedTime(Math.floor(hfTimer.val())));
    hfTimer.val(parseFloat(hfTimer.val()) + ((now - before) / 1000));
    $('#datestamp').val(now);
}

function GetElapsedTime(seconds) {
    var sec_num = parseInt(seconds, 10);
    var hours = Math.floor(sec_num / 3600);
    var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
    seconds = sec_num - (hours * 3600) - (minutes * 60);

    if (hours < 10) {
        hours = "0" + hours;
    }
    if (minutes < 10) {
        minutes = "0" + minutes;
    }
    if (seconds < 10) {
        seconds = "0" + seconds;
    }
    var time = hours + ':' + minutes + ':' + seconds;
    return time;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input type="hidden" id="hfTimer" value=0 />
<input type="hidden" id="datestamp" />
<div id="spnTimer">00:00:00</div>
<br />
<input type="button" id="messThingsUp" value="press me" />

请注意,为了获得更好的分辨率,定时器间隔设置为200ms;在您的情况下,这可能是可接受的,也可能是不可接受的,因为它会使浏览器经常检查计时器,并且可能会干扰其他定时任务(例如动画)。您可以将间隔调整得更大(<= 1000), but the greater the interval, the greater the chance the timer will report incorrect results after the pause, before it can "catch up"...


0
投票

没有解决方法可以让计时器在出现警报时继续滴答作响。避免使用警报或确认框,而是创建一个所谓的模式框或只是一个

position:fixed;
<div>
来通知用户。

© www.soinside.com 2019 - 2024. All rights reserved.