如何创建一个 JQuery 时钟/计时器

63
我有一个简单的测验应用程序,我想在页面顶部显示一个漂亮的计时器/时钟,以向用户展示他们进行了多长时间。(如果我能以某种方式为他们展示 Total Quiz Time 的计时器,并且还有一个 This Question Time 的计时器那就更酷了,但是我应该可以自己解决如何让一个计时器工作的问题。)
我的问题是: 使用 JQuery 显示一个简单的计时器/时钟的好方法?(纯JS也可以)我知道如何检查时间,但如何获得增加的秒数呢? 我的搜索不断地引导我去使用JQuery插件(我想自己实现),以及 "事件定时器",这都不是我所要寻找的...
12个回答

114
你需要寻找setInterval函数,它可以每隔x毫秒运行一次函数。
例如:
var start = new Date;

setInterval(function() {
    $('.Timer').text((new Date - start) / 1000 + " Seconds");
}, 1000);

4
从10秒开始,小数点后的数字将被省略。看来我们需要在这里使用 round() 函数? - Avatar
8
这段代码看起来不错。$('.Timer').text(Math.round((new Date - start) / 1000, 0) + " 秒"); - Arun Banik

42

像SLaks建议的那样使用setInterval正是我制作定时器所需要的。(谢谢你,伙计!)

使用setInterval和这篇优秀的博客文章,我最终创建了以下函数,在我的“box_header”div中显示一个计时器。我希望这能帮助其他有类似需求的人!

 function get_elapsed_time_string(total_seconds) {
  function pretty_time_string(num) {
    return ( num < 10 ? "0" : "" ) + num;
  }

  var hours = Math.floor(total_seconds / 3600);
  total_seconds = total_seconds % 3600;

  var minutes = Math.floor(total_seconds / 60);
  total_seconds = total_seconds % 60;

  var seconds = Math.floor(total_seconds);

  // Pad the minutes and seconds with leading zeros, if required
  hours = pretty_time_string(hours);
  minutes = pretty_time_string(minutes);
  seconds = pretty_time_string(seconds);

  // Compose the string for display
  var currentTimeString = hours + ":" + minutes + ":" + seconds;

  return currentTimeString;
}

var elapsed_seconds = 0;
setInterval(function() {
  elapsed_seconds = elapsed_seconds + 1;
  $('#box_header').text(get_elapsed_time_string(elapsed_seconds));
}, 1000);

12
嘿,不要相信该函数会完全按照每1000毫秒运行,否则你将跟不上同步。你需要存储起始日期,并像该问题的已接受答案所示,每次计算时间差。 - jvanderh
1
@jvanderh - 在这种情况下,时间间隔需要缩短至100毫秒或250毫秒左右,否则可能会出现秒跳动的情况(10、11、12、14、15……)。 - jamix

18
################## JQuery (use API) #################   
 $(document).ready(function(){
         function getdate(){
                var today = new Date();
            var h = today.getHours();
            var m = today.getMinutes();
            var s = today.getSeconds();
             if(s<10){
                 s = "0"+s;
             }
             if (m < 10) {
                m = "0" + m;
            }
            $("h1").text(h+" : "+m+" : "+s);
             setTimeout(function(){getdate()}, 500);
            }

        $("button").click(getdate);
    });

################## HTML ###################
<button>start clock</button>
<h1></h1>

6
太好了!如果使用jQuery(我是这样做的),显示时钟的方法简单直接。我为任何有兴趣查看此操作的人创建了一个jsfiddle。在这里检查它......http://jsfiddle.net/smallworld/ng22Y/1/ - smallworld
太棒了。直截了当、简单明了。感谢分享。 - Ajay Kumar

11

如何兼顾两者?我将答案与提问者的格式结合起来。

function pretty_time_string(num) {
    return ( num < 10 ? "0" : "" ) + num;
  }

var start = new Date;    

setInterval(function() {
  var total_seconds = (new Date - start) / 1000;   

  var hours = Math.floor(total_seconds / 3600);
  total_seconds = total_seconds % 3600;

  var minutes = Math.floor(total_seconds / 60);
  total_seconds = total_seconds % 60;

  var seconds = Math.floor(total_seconds);

  hours = pretty_time_string(hours);
  minutes = pretty_time_string(minutes);
  seconds = pretty_time_string(seconds);

  var currentTimeString = hours + ":" + minutes + ":" + seconds;

  $('.timer').text(currentTimeString);
}, 1000);

在这种方法中,由于回调触发时间的偏差,两个连续的调用可能会在同一秒钟结束,因此您需要更频繁地更新文本,并且您的显示屏可能会跳过几秒钟。我使用100毫秒的更新间隔以确保安全。 - jamix
似乎答案被合并到另一个线程中,并没有直接回答这个问题。在我的回答中,我采用了原始函数并进行了简单的复制和粘贴调整。 - Brutnus

8
一种 24 小时制的时钟:
setInterval(function(){

        var currentTime = new Date();
        var hours = currentTime.getHours();
        var minutes = currentTime.getMinutes();
        var seconds = currentTime.getSeconds();

        // Add leading zeros
        minutes = (minutes < 10 ? "0" : "") + minutes;
        seconds = (seconds < 10 ? "0" : "") + seconds;
        hours = (hours < 10 ? "0" : "") + hours;

        // Compose the string for display
        var currentTimeString = hours + ":" + minutes + ":" + seconds;
        $(".clock").html(currentTimeString);

},1000);

// 24 hour clock  
setInterval(function() {

  var currentTime = new Date();
  var hours = currentTime.getHours();
  var minutes = currentTime.getMinutes();
  var seconds = currentTime.getSeconds();

  // Add leading zeros
  hours = (hours < 10 ? "0" : "") + hours;
  minutes = (minutes < 10 ? "0" : "") + minutes;
  seconds = (seconds < 10 ? "0" : "") + seconds;

  // Compose the string for display
  var currentTimeString = hours + ":" + minutes + ":" + seconds;
  $(".clock").html(currentTimeString);

}, 1000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="clock"></div>


3
如果您可以使用jQuery和Moment.js(优秀的库),那么这是一种方法:
var crClockInit1 = null;
var crClockInterval = null;
function crInitClock() {
    crClockInit1 = setInterval(function() {
        if (moment().format("SSS") <= 40) {
            clearInterval(crClockInit1);
            crStartClockNow();
        }
    }, 30);
}

function crStartClockNow() {
    crClockInterval = setInterval(function() {
        $('#clock').html(moment().format('D. MMMM YYYY H:mm:ss'));
    }, 1000);
}

使用crInitClock()开始时钟初始化。这样做是为了同步秒数。如果不进行同步,你会在半秒钟内启动1秒计时器,而实际时间则会晚半秒钟。


0
    var timeInterval = 5;
    var blinkTime = 1;
    var open_signal = 'signal1';
    var total_signal = 1;

    $(document).ready(function () {
        for (var i = 1; i <= total_signal; i++) {
            var timer = (i == 1) ? timeInterval : (timeInterval * (i - 1));

            var str_html = '<div id="signal' + i + '">' +
                           '<span class="float_left">Signal ' + i + ' : </span>' +
                           '<div class="red float_left"></div>' +
                           '<div class="yellow float_left"></div>' +
                           '<div class="green float_left"></div>' +
                           '<div class="timer float_left">' + timer + '</div>' +
                           '<div style="clear: both;"></div>' +
                           '</div><div class="div_separate"></div>';

            $('.div_demo').append(str_html);
        }

        $('.div_demo .green').eq(0).css('background-color', 'green');
        $('.div_demo .red').css('background-color', 'red');
        $('.div_demo .red').eq(0).css('background-color', 'white');

        setInterval(function () {
            manageSignals();
        }, 1000);
    });

    function manageSignals() {
        var obj_timer = {};

        var temp_i = parseInt(open_signal.substr(6));
        if ($('#' + open_signal + ' .timer').html() == '0')
            open_signal = (temp_i == total_signal) ? 'signal1' : 'signal' + (temp_i + 1);

        for (var i = 1; i <= total_signal; i++) {
            var next_signal = (i == total_signal) ? 'signal1' : 'signal' + (i + 1);

            obj_timer['signal' + i] = parseInt($('#signal' + i + ' .timer').html()) - 1;

            if (obj_timer['signal' + i] == -1 && open_signal == next_signal && total_signal!=1) {
                obj_timer['signal' + i] = (timeInterval * (total_signal - 1)) - 1;

                $('#signal' + i + ' .red').css('background-color', 'red');
                $('#signal' + i + ' .yellow').css('background-color', 'white');
            }
            else if (obj_timer['signal' + i] == -1 && open_signal == 'signal' + i) {
                obj_timer['signal' + i] = (timeInterval - 1);

                $('#signal' + i + ' .red').css('background-color', 'white');
                $('#signal' + i + ' .yellow').css('background-color', 'white');
                $('#signal' + i + ' .green').css('background-color', 'green');
            }
            else if (obj_timer['signal' + i] == blinkTime && open_signal == 'signal' + i) {
                $('#signal' + i + ' .yellow').css('background-color', 'yellow');
                $('#signal' + i + ' .green').css('background-color', 'white');
            }

            $('#signal' + i + ' .timer').html(obj_timer['signal' + i]);
        }
    }
</script>

0
var eventdate = new Date("January 01, 2014 00:00:00");

function toSt(n) {
 s=""
 if(n<10) s+="0"
 return s+n.toString();
}

function countdown() {
 cl=document.clock;
 d=new Date();
 count=Math.floor((eventdate.getTime()-d.getTime())/1000);
 if(count<=0)
   {cl.days.value ="----";
    cl.hours.value="--";
    cl.mins.value="--";
    cl.secs.value="--";
    return;
  }
 cl.secs.value=toSt(count%60);
 count=Math.floor(count/60);
 cl.mins.value=toSt(count%60);
 count=Math.floor(count/60);
 cl.hours.value=toSt(count%24);
 count=Math.floor(count/24);
 cl.days.value=count;    

 setTimeout("countdown()",500);
}

你好,我有一个类似的任务,涉及创建一个JavaScript倒计时时钟。这是我使用的代码。将上面的代码插入到< script language="Javascript" >< /script > 标记之间。请记住,如果没有用于显示时钟的HTML,仅拥有此JavaScript不会有太多作用。编写HTML留给你。可以根据自己的喜好设计时钟。


0

这是@SLaks的答案,但使用纯ES6 JavaScript。

var start = new Date,
  $timer = document.querySelector('.Timer');

setInterval(function(timestamp) {
    $timer.innerText = `${timestamp - start) / 1000} Seconds`;
}, 1000);


0

刚刚使用了@Uday的答案代码,并构建了一个hr:mm的倒计时钟。

只是玩一下,所以想如果有人需要的话,就在评论中分享这个小工具(不知道为什么stackoverflow不允许我在这里粘贴链接)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接