简体   繁体   English

javascript倒数时钟

[英]javascript countdown clock

 <script>
var interval;
var minutes = 1;
var seconds = 5;
window.onload = function() {
    countdown('countdown');
}

function countdown(element) {
    interval = setInterval(function() {
        var el = document.getElementById(element);
        if(seconds == 0) {
            if(minutes == 0) {
                el.innerHTML = "countdown's over!";                    
                clearInterval(interval);
                return;
            } else {
                minutes--;
                seconds = 60;
            }
        }
        if(minutes > 0) {
            var minute_text = minutes + (minutes > 1 ? ' minutes' : ' minute');
        } else {
            var minute_text = '';
        }
        var second_text = seconds > 1 ? 'seconds' : 'second';
        el.innerHTML = minute_text + ' ' + seconds + ' ' + second_text + ' remaining';
        seconds--;
    }, 1000);
}
</script>

this is a good countdown clock and i want to show the time in datalist how do i do it? 这是一个不错的倒计时时钟,我想在数据列表中显示时间该怎么办? like in this site www.1buy1.co.il 就像在这个网站上www.1buy1.co.il

The answers I see here work pretty well but are not entirely rigorous. 我在这里看到的答案效果很好,但并不完全严格。 Although setInterval() seems like the right function to use, it suffers from a slight "drift" over time. 尽管setInterval()似乎是正确使用的函数,但随着时间的流逝,它会出现轻微的“漂移”。 Also, if some other JavaScript function takes a second or more to execute then your countdown clock can get stalled and show the wrong time. 此外,如果其他一些JavaScript函数需要一秒钟或更长时间才能执行,则您的倒数时钟可能会停滞并显示错误的时间。

Although these occurrences might be unlikely, greater precision is really not more difficult. 尽管这些情况不太可能发生,但提高精度确实并不困难。 What you want is a timer that pulls the clock back from any inaccuracy. 您想要的是一个计时器,可以将时钟从任何不准确的地方拉回来。 You'll need to calculate time off the system clock rather than from the frequency of time intervals, and for this you'll have to give up setInterval() in favor of a series of setTimeout() calls. 您将需要计算系统时钟以外的时间,而不是根据时间间隔的频率来计算时间,为此,您必须放弃setInterval(),而支持一系列setTimeout()调用。 The following code shows how. 以下代码显示了如何。

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 = "countdown's over!";
        } else {
            time = new Date( msLeft );
            hours = time.getUTCHours();
            mins = time.getUTCMinutes();
            element.innerHTML = (hours ? hours + ':' + twoDigits( mins ) : mins) +
                ':' + twoDigits( time.getUTCSeconds() );
            setTimeout( updateTimer, time.getUTCMilliseconds() + 500 );
        }
    }

    element = document.getElementById( elementName );
    endTime = (+new Date) + 1000 * (60*minutes + seconds) + 500;
    updateTimer();
}

Try it: http://jsfiddle.net/mrwilk/qVuHW 试试看: http : //jsfiddle.net/mrwilk/qVuHW

If your clock should by chance align very closely to the seconds of the system clock, your countdown timer can appear to "miss beats" due to receiving timeout events just slightly before or just slightly after a one-second interval. 如果您的时钟偶然地与系统时钟的秒数非常接近,则倒计时计时器可能会由于在1秒间隔之前或之后稍稍接收到超时事件而显得“跳动”。 The solution is to align your events on the half-second; 解决方案是将事件调整为半秒。 that is, midway between the beats of the seconds of the system clock. 也就是说,介于系统时钟的秒拍之间。 That what the 500's in the code do, where 500ms = ½sec. 这就是代码中500的作用,其中500ms =½sec。

The only other matter worth noting is that the code here displays hours as well as minutes and seconds; 唯一需要注意的另一件事是,这里的代码显示了小时以及分钟和秒。 that is, HH:MM:SS. 即HH:MM:SS。 Computing hours, minutes and seconds from milliseconds is not difficult but is a bit awkward, and it's simplest to let the Date object do this work for you. 从毫秒计算小时,分钟和秒并不困难,但有点尴尬,让Date对象为您完成这项工作最简单。

I've cleaned up the above code and made it format like your example. 我已经清理了上面的代码,并使其格式像您的示例一样。 It also removed the global variables and allows you to create multiple timers. 它还删除了全局变量,并允许您创建多个计时器。

There's a live link here http://jsfiddle.net/Apnu2/6/ 这里有一个实时链接http://jsfiddle.net/Apnu2/6/

countdown('countdown', 1, 5);
function countdown(element, minutes, seconds) {
    // set time for the particular countdown
    var time = minutes*60 + seconds;
    var interval = setInterval(function() {
        var el = document.getElementById(element);
        // if the time is 0 then end the counter
        if(time == 0) {
            el.innerHTML = "countdown's over!";    
            clearInterval(interval);
            return;
        }
        var minutes = Math.floor( time / 60 );
        if (minutes < 10) minutes = "0" + minutes;
        var seconds = time % 60;
        if (seconds < 10) seconds = "0" + seconds; 
        var text = minutes + ':' + seconds;
        el.innerHTML = text;
        time--;
    }, 1000);
}
                            <script>
            var s=3600;
            var h=Math.floor(s/3600);
            var m=Math.floor((s%3600)/60);
            var sec=(s%60);
            window.clearInterval(x);
            function clock()
            {
             if(m!=0)
             if(sec==0){
             m=m-1; sec=59;} 
             if(h!=0)
             if(m==0){
             h=h-1;m=59;
             sec=59;}
             if((m==0&&h==0&&sec==0))
             $(this).stop();
             --sec;
             var hr=(h<10? "0":"")+h;
             var minu=(m<10? "0":"")+m;
             var second=(sec<10? "0":"")+sec;
             document.getElementById("time").innerHTML=hr+":"+ minu +":"+second ;
            }
            var x=window.setInterval(clock,10);

            </script>

The element in the script is the id of the tag you pass to the function. 脚本中的element是您传递给函数的标签的ID。
So countdown('div1') will show a timer in a tag with id="div1" 因此, countdown('div1')将在id为“ div1”的代码中显示一个计时器

However your particular timer does not allow multiple instances and uses a global var called interval. 但是,您的特定计时器不允许多个实例,并使用称为间隔的全局变量。

Generate the JSON on the server and the rest takes care of itself 在服务器上生成JSON,其余的由自己负责

HERE is an OO version that is more precise since it is only calculating the end time instead of relying on interval which will block if the browser is busy: http://jsbin.com/ujuzo5/edit 这里是一个更精确的OO版本,因为它只计算结束时间而不是依赖于间隔,如果浏览器繁忙,间隔会阻塞: http : //jsbin.com/ujuzo5/edit

And here is my original solution with the help of the good folks at SO here: Broken closure - please help me fix it 这是我在SO优秀人员的帮助下提供的原始解决方案: 损坏的封口-请帮助我修复它

<script type="text/javascript">
// generate this on the server and note there is no comma after the last item
var counters = {
  "shoes":{"id":"shoe1","minutes":1,"seconds":5},
  "trousers":{"id":"trouser1","minutes":10,"seconds":0}
};

var intervals = {};

window.onload = function() {
  for (var el in counters) { countdown(counters[el]) };
}
function countdown(element) {
    var minutes = element.minutes;
    var seconds = element.seconds;

    intervals[element.id] = setInterval(function() {
        var el = document.getElementById(element.id);
        if(seconds == 0) {
            if(minutes == 0) {
                el.innerHTML = "countdown's over!";                    
                clearInterval(intervals[element.id]);
                return;
            } else {
                minutes--;
                seconds = 60;
            }
        }
        if(minutes > 0) {
            var minute_text = minutes + (minutes > 1 ? ' minutes' : ' minute');
        } else {
            var minute_text = '';
        }
        var second_text = seconds > 1 ? 'seconds' : 'second';
        el.innerHTML = minute_text + ' ' + seconds + ' ' + second_text + ' remaining';
        seconds--;
        // optionally update the member values
        element.minutes=minutes;
        element.seconds=seconds;
    }, 1000);
}

</script>
shoes: <span id="shoe1"></span><br />
trousers: <span id="trouser1"></span><br />

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM