Mümkün olan en basit JavaScript geri sayım sayacı? [kapalı]


240

Sadece mümkün olan en basit geri sayım sayacını nasıl oluşturacağınızı sormak istedim.

Sitede şöyle bir cümle olacak:

İnternethaber.com "Kayıt 05:00 dakika içinde kapanıyor!"

Yani, ne yapmak istiyorum "05:00" den "00:00" gider ve sonra sona erdiğinde "05:00" sıfırlar basit bir js geri sayım sayacı oluşturmaktır.

Daha önce bazı cevaplardan geçiyordum, ama hepsi yapmak istediğim şey için çok yoğun (Tarih nesneleri, vb.)


4
Ve yine, ilgili HTML'yi dışarıda bırakıyorsunuz, ancak en azından bu kez karmaşıklık sorununu açıkladınız. Ama cidden, kendiniz bir çözüm üretmeye bakmanız ve sonra gelip bize yaşadığınız sorunları sormanız gerekir.
David, Monica'nın

Nasıl çok karmaşık olduklarına dair şikayetleri olan kod örneklerini? Her neyse, sanırım kolayca setIntervalve tarih tabanlı yerine .innerHTML tabanlı yapabilirsiniz.
bjb568

1
Evet, insanlar çözümü kendileri yapmaya çalışmalıdır. Ancak javaScript ile ortak görevleri yerine getirmenin birçok örneği vardır. Geri sayım sayacını nasıl yapacağımı biliyorum, ancak web'de bir bileşen bulmamı tercih ederim. Bu soru ve kapsamlı cevap sayesinde aradığımı buldum. Geri sayım mantığı
Carlos Rafael Ramirez

2
Bu çözümleri daha basit buldum: stackoverflow.com/questions/32141035/…
nu everest

Yanıtlar:


491

Biri olan jQueryve olmayan iki demo var . İkisi de tarih işlevlerini kullanmaz ve neredeyse o kadar basit değildir.

Vanilya JavaScript ile demo

function startTimer(duration, display) {
    var timer = duration, minutes, seconds;
    setInterval(function () {
        minutes = parseInt(timer / 60, 10);
        seconds = parseInt(timer % 60, 10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.textContent = minutes + ":" + seconds;

        if (--timer < 0) {
            timer = duration;
        }
    }, 1000);
}

window.onload = function () {
    var fiveMinutes = 60 * 5,
        display = document.querySelector('#time');
    startTimer(fiveMinutes, display);
};
<body>
    <div>Registration closes in <span id="time">05:00</span> minutes!</div>
</body>

JQuery ile demo

function startTimer(duration, display) {
    var timer = duration, minutes, seconds;
    setInterval(function () {
        minutes = parseInt(timer / 60, 10);
        seconds = parseInt(timer % 60, 10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.text(minutes + ":" + seconds);

        if (--timer < 0) {
            timer = duration;
        }
    }, 1000);
}

jQuery(function ($) {
    var fiveMinutes = 60 * 5,
        display = $('#time');
    startTimer(fiveMinutes, display);
});

Ancak, biraz daha karmaşık olan daha doğru bir zamanlayıcı istiyorsanız:

function startTimer(duration, display) {
    var start = Date.now(),
        diff,
        minutes,
        seconds;
    function timer() {
        // get the number of seconds that have elapsed since 
        // startTimer() was called
        diff = duration - (((Date.now() - start) / 1000) | 0);

        // does the same job as parseInt truncates the float
        minutes = (diff / 60) | 0;
        seconds = (diff % 60) | 0;

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.textContent = minutes + ":" + seconds; 

        if (diff <= 0) {
            // add one second so that the count down starts at the full duration
            // example 05:00 not 04:59
            start = Date.now() + 1000;
        }
    };
    // we don't want to wait a full second before the timer starts
    timer();
    setInterval(timer, 1000);
}

window.onload = function () {
    var fiveMinutes = 60 * 5,
        display = document.querySelector('#time');
    startTimer(fiveMinutes, display);
};
<body>
    <div>Registration closes in <span id="time"></span> minutes!</div>
</body>

Şimdi birkaç basit zamanlayıcı yaptığımıza göre, yeniden kullanılabilirlik ve endişeleri ayırma üzerine düşünmeye başlayabiliriz. Bunu "geri sayım sayacı ne yapmalı?" Diye sorarak yapabiliriz.

  • Geri sayım sayacı geri saymalı mı? Evet
  • Geri sayım sayacı DOM'da nasıl görüntüleneceğini bilmeli mi? Hayır
  • Geri sayım sayacı 0'a ulaştığında kendini yeniden başlatmayı bilmeli midir? Hayır
  • Geri sayım sayacı, bir müşterinin ne kadar süre kaldığına erişmesi için bir yol sağlamalı mıdır? Evet

Bu şeyler göz önünde bulundurularak daha iyi (ama yine de çok basit) yazalım CountDownTimer

function CountDownTimer(duration, granularity) {
  this.duration = duration;
  this.granularity = granularity || 1000;
  this.tickFtns = [];
  this.running = false;
}

CountDownTimer.prototype.start = function() {
  if (this.running) {
    return;
  }
  this.running = true;
  var start = Date.now(),
      that = this,
      diff, obj;

  (function timer() {
    diff = that.duration - (((Date.now() - start) / 1000) | 0);

    if (diff > 0) {
      setTimeout(timer, that.granularity);
    } else {
      diff = 0;
      that.running = false;
    }

    obj = CountDownTimer.parse(diff);
    that.tickFtns.forEach(function(ftn) {
      ftn.call(this, obj.minutes, obj.seconds);
    }, that);
  }());
};

CountDownTimer.prototype.onTick = function(ftn) {
  if (typeof ftn === 'function') {
    this.tickFtns.push(ftn);
  }
  return this;
};

CountDownTimer.prototype.expired = function() {
  return !this.running;
};

CountDownTimer.parse = function(seconds) {
  return {
    'minutes': (seconds / 60) | 0,
    'seconds': (seconds % 60) | 0
  };
};

Peki bu uygulama neden diğerlerinden daha iyi? İşte onunla neler yapabileceğinize dair bazı örnekler. İlk örnek dışındaki tüm öğelerin startTimerişlevlerle gerçekleştirilemeyeceğini unutmayın.

Saati XX: XX biçiminde görüntüleyen ve 00: 00'a ulaştıktan sonra yeniden başlayan bir örnek

Zamanı iki farklı biçimde gösteren bir örnek

İki farklı zamanlayıcıya ve yalnızca bir yeniden başlatmaya sahip bir örnek

Bir düğmeye basıldığında geri sayım zamanlayıcısını başlatan bir örnek


2
Sen adamsın! Tam da aradığım şey buydu. Teşekkür ederim! Bir şey daha: dakikaların önüne "0" ı nasıl ekleyebilirim, bu yüzden "4:59" yerine "04:59" gösterir?
Bartek

1
minutes = minutes < 10 ? "0" + minutes : minutes;
robbmj

8
@timbram, bir vardeklarasyondan sonra virgülün farklı beyanları ayırdığını fark edene kadar, ilk başta da bana garip geldi . bu nedenle minutesve secondsbasitçe bildirilen (ancak başlatılmamış) değişkenlerdir. böylece timersadece eşit basitçe edilir durationaz parametre, başka bir şey, hiçbir şey.
abustamam

2
@SinanErdem Bunu yapan bir kod yazdım. Bu kodu bugün daha sonra cevaba ekleyebilirim. Bu yapıldığında size ping atacağım.
robbmj

3
Sıfırlama seçeneklerini nasıl eklersiniz? Ve ayrıca bir duraklama ve özgeçmiş? Bunu bir alan eklemeyi denedim. Sıfırlama ve kapanışta kontrol et. Ama saat yine de devam ediyor.
Dzung Nguyen

24

Gerçek bir zamanlayıcı istiyorsanız date nesnesini kullanmanız gerekir.

Farkı hesaplayın.

Dizenizi biçimlendirin.

window.onload=function(){
      var start=Date.now(),r=document.getElementById('r');
      (function f(){
      var diff=Date.now()-start,ns=(((3e5-diff)/1e3)>>0),m=(ns/60)>>0,s=ns-m*60;
      r.textContent="Registration closes in "+m+':'+((''+s).length>1?'':'0')+s;
      if(diff>3e5){
         start=Date.now()
      }
      setTimeout(f,1e3);
      })();
}

Misal

Jsfiddle

çok hassas değil zamanlayıcı

var time=5*60,r=document.getElementById('r'),tmp=time;

setInterval(function(){
    var c=tmp--,m=(c/60)>>0,s=(c-m*60)+'';
    r.textContent='Registration closes in '+m+':'+(s.length>1?'':'0')+s
    tmp!=0||(tmp=time);
},1000);

JsFiddle


16

SetInterval.Below işlevini kullanarak kolayca bir zamanlayıcı işlevi oluşturabilirsiniz.Below, zamanlayıcıyı oluşturmak için kullanabileceğiniz koddur.

http://jsfiddle.net/ayyadurai/GXzhZ/1/

window.onload = function() {
  var minute = 5;
  var sec = 60;
  setInterval(function() {
    document.getElementById("timer").innerHTML = minute + " : " + sec;
    sec--;
    if (sec == 00) {
      minute --;
      sec = 60;
      if (minute == 0) {
        minute = 5;
      }
    }
  }, 1000);
}
Registration closes in <span id="timer">05:00<span> minutes!


3
Her saniyeyi doğru bir şekilde temsil etmez, çok hızlı geri sayım yapar.
Scott Rowley

4
500'den 1000'e değiştirmek bunu doğru yapıyor gibi görünüyor.
Scott Rowley

Kaygan çözüm, karışıklığı önlemek için olsa da saat dakika olarak değiştirilmelidir
embulldogs99
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.