Basit bir JavaScript geri sayım sayacı için kod mu?


148

İşlevin çalıştırılmasından 30 saniye sonra başlayan ve 0'da biten basit bir geri sayım sayacı kullanmak istiyorum. Milisaniye yok. Nasıl kodlanabilir?

Yanıtlar:


256
var count=30;

var counter=setInterval(timer, 1000); //1000 will  run it every 1 second

function timer()
{
  count=count-1;
  if (count <= 0)
  {
     clearInterval(counter);
     //counter ended, do something here
     return;
  }

  //Do code for showing the number of seconds here
}

Zamanlayıcının kodunun bir paragrafta (veya sayfanın herhangi bir yerinde) görünmesini sağlamak için satırı koymanız yeterlidir:

<span id="timer"></span>

Saniyelerin görünmesini istediğiniz yer. Ardından aşağıdaki satırı timer()işlevinize ekleyin , böylece şöyle görünür:

function timer()
{
  count=count-1;
  if (count <= 0)
  {
     clearInterval(counter);
     return;
  }

 document.getElementById("timer").innerHTML=count + " secs"; // watch for spelling
}

Cevap için teşekkürler. Zamanlayıcım bir paragrafta göründüğü için kullanmakta güçlük çekiyorum. 30, 29, 28 vb. Bir paragrafın ortasına nasıl koyabilirim?
Mike

1
Cevabımı paragrafta zamanlayıcıyı nasıl görüntüleyeceğinizi gösterecek şekilde düzenledim :)
17'de Yükselt'e tıklayın

2
Bir paragrafın ortasında (yatay olarak): <p id = "timer" style = "text-align: center"> </p>
Alsciende

Tıklayın, zamanlayıcınız yalnızca "0 saniye" gösterecektir. İnnerHTML güncellemesini son durumda değil, küçültmeden sonra koymalısınız.
Alsciende

1
Merhaba sayfa yüklemede ve bunun yerine yalnızca bir düğmeye basıldığında zamanlayıcının çalışmasını nasıl durdurabilirim? Ayrıca zamanlayıcı bittikten sonra bir düğmeye basıldığında zamanlayıcıyı nasıl sıfırlayabilirim?
crmepham

104

Bu senaryoyu bir süre önce yazdım:

Kullanım:

var myCounter = new Countdown({  
    seconds:5,  // number of seconds to count down
    onUpdateStatus: function(sec){console.log(sec);}, // callback for each second
    onCounterEnd: function(){ alert('counter ended!');} // final action
});

myCounter.start();

function Countdown(options) {
  var timer,
  instance = this,
  seconds = options.seconds || 10,
  updateStatus = options.onUpdateStatus || function () {},
  counterEnd = options.onCounterEnd || function () {};

  function decrementCounter() {
    updateStatus(seconds);
    if (seconds === 0) {
      counterEnd();
      instance.stop();
    }
    seconds--;
  }

  this.start = function () {
    clearInterval(timer);
    timer = 0;
    seconds = options.seconds;
    timer = setInterval(decrementCounter, 1000);
  };

  this.stop = function () {
    clearInterval(timer);
  };
}

1
Diğerlerinin yerine bunu kullanmayı çok isterim. Başlangıç ​​numarasını yeniden başlatmak zorunda kaldığımda, bunun iyi çalıştığını görüyorum ..
Oki Erie Rinaldi

Zamanlayıcıyı herhangi bir şans eseri durdurmam gerekirse, bunu nasıl yapacağım?
SIJ

@SIJ myCounter.stop();
R3tep

54

Şimdiye kadar cevaplar, anında çalıştırılan koda dayanıyor gibi görünüyor. 1000 ms için bir zamanlayıcı ayarlarsanız, aslında bunun yerine 1008 civarında olacaktır.

İşte bunu nasıl yapmalısınız:

function timer(time,update,complete) {
    var start = new Date().getTime();
    var interval = setInterval(function() {
        var now = time-(new Date().getTime()-start);
        if( now <= 0) {
            clearInterval(interval);
            complete();
        }
        else update(Math.floor(now/1000));
    },100); // the smaller this number, the more accurate the timer will be
}

Kullanmak için arayın:

timer(
    5000, // milliseconds
    function(timeleft) { // called every step to update the visible countdown
        document.getElementById('timer').innerHTML = timeleft+" second(s)";
    },
    function() { // what to do after
        alert("Timer complete!");
    }
);

2
Dediğin gibi, bunu doğru yapmanın tek ve tek yolu bu!
mcella

3
Bir uyarı ile bir başparmak yukarı verdim - görüntüleme amacıyla muhtemelen yer yerine tavanı (Math.ceil ()) göstermek istersiniz. Uyarı çalışmadan önce saat 0'a ulaştığında gerçekten kafa karıştırıcı. (O zaman elbette tamamlanmadan önce () güncelleme için ek bir çağrı olması gerekir ())
Paul Williams

21

İşte dakikalar ve saniyeler için birine ihtiyacı olan biri varsa:

    var mins = 10;  //Set the number of minutes you need
    var secs = mins * 60;
    var currentSeconds = 0;
    var currentMinutes = 0;
    /* 
     * The following line has been commented out due to a suggestion left in the comments. The line below it has not been tested. 
     * setTimeout('Decrement()',1000);
     */
    setTimeout(Decrement,1000); 

    function Decrement() {
        currentMinutes = Math.floor(secs / 60);
        currentSeconds = secs % 60;
        if(currentSeconds <= 9) currentSeconds = "0" + currentSeconds;
        secs--;
        document.getElementById("timerText").innerHTML = currentMinutes + ":" + currentSeconds; //Set the element id you need the time put into.
        if(secs !== -1) setTimeout('Decrement()',1000);
    }

SetTimeout'un ilk parametresine bir string geçmemelisiniz setTimeout(Decrement, 1000), tercih edilir. stackoverflow.com/questions/6232574/…
Scottux

Öneriniz için teşekkür ederim, senaryoyu güncelledim.
Layton Everson

3

// Javascript Countdown
// Version 1.01 6/7/07 (1/20/2000)
// by TDavid at http://www.tdscripts.com/
var now = new Date();
var theevent = new Date("Sep 29 2007 00:00:01");
var seconds = (theevent - now) / 1000;
var minutes = seconds / 60;
var hours = minutes / 60;
var days = hours / 24;
ID = window.setTimeout("update();", 1000);

function update() {
  now = new Date();
  seconds = (theevent - now) / 1000;
  seconds = Math.round(seconds);
  minutes = seconds / 60;
  minutes = Math.round(minutes);
  hours = minutes / 60;
  hours = Math.round(hours);
  days = hours / 24;
  days = Math.round(days);
  document.form1.days.value = days;
  document.form1.hours.value = hours;
  document.form1.minutes.value = minutes;
  document.form1.seconds.value = seconds;
  ID = window.setTimeout("update();", 1000);
}
<p><font face="Arial" size="3">Countdown To January 31, 2000, at 12:00: </font>
</p>
<form name="form1">
  <p>Days
    <input type="text" name="days" value="0" size="3">Hours
    <input type="text" name="hours" value="0" size="4">Minutes
    <input type="text" name="minutes" value="0" size="7">Seconds
    <input type="text" name="seconds" value="0" size="7">
  </p>
</form>


8
Bu komut dosyası 90'lardan çok kötü uygulamaları kullanıyor. Ve ayrıca 1.5 saat 2 saat değildir. 1 saat 30 dk. Kullanmamalısın Math.floor, değilMath.round
corbacho

3

ClickUpvote'un yanıtı @ değiştirildi :

Sen kullanabilirsiniz hayatını (Hemen çağrılan işlev İfade) biraz daha kolay hale getirilmiş, özyinelemeye:

var i = 5;  //set the countdown
(function timer(){
    if (--i < 0) return;
    setTimeout(function(){
        console.log(i + ' secs');  //do stuff here
        timer();
    }, 1000);
})();


2

Kabul edilen cevabın genişletilmesi, makinenizin uykuya geçmesi vb. Zamanlayıcının çalışmasını geciktirebilir. Küçük bir işlem pahasına gerçek bir zaman elde edebilirsiniz. Bu, kalan gerçek zamanı verecektir.

<span id="timer"></span>

<script>
var now = new Date();
var timeup = now.setSeconds(now.getSeconds() + 30);
//var timeup = now.setHours(now.getHours() + 1);

var counter = setInterval(timer, 1000);

function timer() {
  now = new Date();
  count = Math.round((timeup - now)/1000);
  if (now > timeup) {
      window.location = "/logout"; //or somethin'
      clearInterval(counter);
      return;
  }
  var seconds = Math.floor((count%60));
  var minutes = Math.floor((count/60) % 60);
  document.getElementById("timer").innerHTML = minutes + ":" + seconds;
}
</script>

0

Saf JS ile aşağıdaki işlemleri yapabilirsiniz. İşleve saniye sayısını sağlamanız yeterlidir ve gerisini o halleder.

var insertZero = n => n < 10 ? "0"+n : ""+n,
   displayTime = n => n ? time.textContent = insertZero(~~(n/3600)%3600) + ":" +
                                             insertZero(~~(n/60)%60) + ":" +
                                             insertZero(n%60)
                        : time.textContent = "IGNITION..!",
 countDownFrom = n => (displayTime(n), setTimeout(_ => n ? sid = countDownFrom(--n)
                                                         : displayTime(n), 1000)),
           sid;
countDownFrom(3610);
setTimeout(_ => clearTimeout(sid),20005);
<div id="time"></div>


0

@Layton Everson tarafından sunulan çözüme dayanarak saatleri, dakikaları ve saniyeleri içeren bir sayaç geliştirdim:

var initialSecs = 86400;
var currentSecs = initialSecs;

setTimeout(decrement,1000); 

function decrement() {
   var displayedSecs = currentSecs % 60;
   var displayedMin = Math.floor(currentSecs / 60) % 60;
   var displayedHrs = Math.floor(currentSecs / 60 /60);

    if(displayedMin <= 9) displayedMin = "0" + displayedMin;
    if(displayedSecs <= 9) displayedSecs = "0" + displayedSecs;
    currentSecs--;
    document.getElementById("timerText").innerHTML = displayedHrs + ":" + displayedMin + ":" + displayedSecs;
    if(currentSecs !== -1) setTimeout(decrement,1000);
}

0

// Javascript Countdown
// Version 1.01 6/7/07 (1/20/2000)
// by TDavid at http://www.tdscripts.com/
var now = new Date();
var theevent = new Date("Nov 13 2017 22:05:01");
var seconds = (theevent - now) / 1000;
var minutes = seconds / 60;
var hours = minutes / 60;
var days = hours / 24;
ID = window.setTimeout("update();", 1000);

function update() {
  now = new Date();
  seconds = (theevent - now) / 1000;
  seconds = Math.round(seconds);
  minutes = seconds / 60;
  minutes = Math.round(minutes);
  hours = minutes / 60;
  hours = Math.round(hours);
  days = hours / 24;
  days = Math.round(days);
  document.form1.days.value = days;
  document.form1.hours.value = hours;
  document.form1.minutes.value = minutes;
  document.form1.seconds.value = seconds;
  ID = window.setTimeout("update();", 1000);
}
<p><font face="Arial" size="3">Countdown To January 31, 2000, at 12:00: </font>
</p>
<form name="form1">
  <p>Days
    <input type="text" name="days" value="0" size="3">Hours
    <input type="text" name="hours" value="0" size="4">Minutes
    <input type="text" name="minutes" value="0" size="7">Seconds
    <input type="text" name="seconds" value="0" size="7">
  </p>
</form>


0

Çözümüm MySQL tarih ve saat biçimleriyle çalışıyor ve bir geri arama işlevi sağlıyor. complition üzerine. Feragatname: İhtiyacım olan şey bu olduğu için yalnızca dakika ve saniyelerle çalışır.

jQuery.fn.countDownTimer = function(futureDate, callback){
    if(!futureDate){
        throw 'Invalid date!';
    }

    var currentTs = +new Date();
    var futureDateTs = +new Date(futureDate);

    if(futureDateTs <= currentTs){
        throw 'Invalid date!';
    }


    var diff = Math.round((futureDateTs - currentTs) / 1000);
    var that = this;

    (function countdownLoop(){
        // Get hours/minutes from timestamp
        var m = Math.floor(diff % 3600 / 60);
        var s = Math.floor(diff % 3600 % 60);
        var text = zeroPad(m, 2) + ':' + zeroPad(s, 2);

        $(that).text(text);

        if(diff <= 0){
            typeof callback === 'function' ? callback.call(that) : void(0);
            return;
        }

        diff--;
        setTimeout(countdownLoop, 1000);
    })();

    function zeroPad(num, places) {
      var zero = places - num.toString().length + 1;
      return Array(+(zero > 0 && zero)).join("0") + num;
    }
}

// $('.heading').countDownTimer('2018-04-02 16:00:59', function(){ // on complete})

0

Performans uğruna, hızlı döngü için setInterval / setTimeout yerine artık requestAnimationFrame'i güvenle kullanabiliriz .

SetInterval / setTimeout kullanılırken, bir döngü görevi aralıktan daha uzun sürüyorsa, tarayıcı tam işlemeye devam etmek için yalnızca aralık döngüsünü uzatacaktır. Bu sorun yaratıyor. SetInterval / setTimeout dakikalarının aşırı yüklenmesinden sonra, bu sekmeyi, tarayıcıyı veya tüm bilgisayarı dondurabilir.

İnternet aygıtlarının çok çeşitli performansları vardır, bu nedenle milisaniye cinsinden sabit bir aralık süresini kodlamak oldukça imkansızdır!

Başlangıç ​​Tarihi Epoch ile geçerli olanı karşılaştırmak için Date nesnesini kullanma . Bu, her şeyden çok daha hızlıdır, tarayıcı sabit bir 60FPS'de ( 1000/60 = 16.66ms kare ) - göz açıp kapayıncaya kadar - ve döngüdeki görev bundan fazlasını gerektiriyorsa , her şeyi halleder. , tarayıcı bazı boyaları bırakacaktır.

Bu, gözlerimizin farkına varmadan önce bir marj sağlar ( İnsan = 24FPS => 1000/24 ​​= 41.66ms kareye göre = akışkan animasyon!)

https://caniuse.com/#search=requestAnimationFrame

/* Seconds to (STRING)HH:MM:SS.MS ------------------------*/
/* This time format is compatible with FFMPEG ------------*/
function secToTimer(sec){
  const o = new Date(0), p =  new Date(sec * 1000)
  return new Date(p.getTime()-o.getTime()).toString().split(" ")[4] + "." + p.getMilliseconds()
}

/* Countdown loop ----------------------------------------*/
let job, origin = new Date().getTime()
const timer = () => {
  job = requestAnimationFrame(timer)
  OUT.textContent = secToTimer((new Date().getTime() - origin) / 1000)
}

/* Start looping -----------------------------------------*/
requestAnimationFrame(timer)

/* Stop looping ------------------------------------------*/
// cancelAnimationFrame(job)

/* Reset the start date ----------------------------------*/
// origin = new Date().getTime()
span {font-size:4rem}
<span id="OUT"></span>
<br>
<button onclick="origin = new Date().getTime()">RESET</button>
<button onclick="requestAnimationFrame(timer)">RESTART</button>
<button onclick="cancelAnimationFrame(job)">STOP</button>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.