Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Odliczanie czasu
Forum PHP.pl > Forum > Przedszkole
Randallmaster
Jak dodać do set interval date oraz callback, potrzebuję osiągnąć odliczanie z przekazaną datą.

  1. var now = new Date(timeServer['year'], timeServer['month'], timeServer['day'], timeServer['hour'], timeServer['minute'] ,timeServer['second'], 00);
  2. interval[id] = window.setInterval(function(){
  3. //tu muszę mieć parametr now, oraz callback
  4. }
Comandeer
Jeśli now jest zdefiniowane poza timerem, to jest w timerze po prostu widoczne.
Randallmaster
A co może być powodem że odlicza źle? Przykładowo odpalam stronę z odliczaniem, zmieniam podgląd zakładki na wp.pl posiedzę z 10 sec i później po powrocie do odliczania mam opóźnienie o to 10 sec.

ps. odliczanie działa poprawnie jeżeli nie zmieniam zakładki w przeglądarce
Comandeer
Bo timery są wstrzymywane/spowalniane gdy się przechodzi na inną kartę
Randallmaster
A można coś z tym zrobić? bo wtedy odliczanie czasu nie jest prawdziwe? przykładowo do końca pozostało 3 min a z powodu zmiany zakładek będzie pokazywało 4?
Comandeer
Wystarczy zapisać czas zakończenia do zmiennej i operować na nim.
Randallmaster
a dokładniej? mam zapisany czas w zmiennej ale tutaj występuje błąd wspomniany powyżej, a ja nie mogę zastosować new Date(), ponieważ z aplikacji korzystają firmy z np. londynu gdzie jest inna strefa czasowa ;/

  1.  
  2. var now = new Date(timeServer['year'], timeServer['month'], timeServer['day'], timeServer['hour'], timeServer['minute'] ,timeServer['second'], 00); //aktualny czas pobrany z serwera
  3.  
  4. interval[id] = window.setInterval(function(){
  5.  
  6. now.setSeconds(now.getSeconds() + 1); //
  7. },1000);
  8.  
Comandeer
Nie bardzo rozumiem problem. Skoro masz czas pobrany z serwera, to wystarczy prowadzić obliczenia na jego podstawie.
Randallmaster
NO POKAZAŁEM KOD. Jak przy takim kodzie przejdę na inną zakładkę i powrócę pokazuje złą godzinę, a trzymam wszystko w zmiennej tylko tak jak napisałeś zmiana zakładki powoduje zwolnienie naliczania
Comandeer
Można to zrobić na czasie UTC.
Można też zapisać do zmiennej czas zakończenia tak samo, jak zrobiłeś to z czasem startu - w tym momencie cała operacja sprowadza się do prostego odejmowania.
Randallmaster
mogę prosić o przykładowy skrypt? Jak dodam do zmiennej czas zakończenia jak zrobiłem z now to tak jak wspomniałeś prędzej będą następować opóźnienia w odejmowaniu po zmianie zakładki.
Comandeer
Ok, kombinowałem w ciut inną stronę.
Kod
<script>
    var timeServer = {
        year: <?=date('Y');?>
        ,month: <?=date('m');?>
        ,day: <?=date('d');?>
        ,hour: <?=date('H');?>
        ,minute: <?=date('i');?>
        ,second: <?=date('s');?>
    }
    ,interval
    ,paused
    ,changeTime = function(i)
    {
        i = i || 1;

        now.setSeconds(now.getSeconds() + i);

        console.log(now);
    }
    ,now = new Date(timeServer['year'], timeServer['month'], timeServer['day'], timeServer['hour'], timeServer['minute'] ,timeServer['second'], 00); //aktualny czas pobrany z serwera


    interval = setInterval(changeTime, 1000);

    document.addEventListener('visibilitychange', function()
    {

        if(document.hidden)
        {
            clearInterval(interval);
            paused = Date.now();
        }
        else
        {
            changeTime(Math.floor((Date.now() - paused) / 1000));

            interval = setInterval(changeTime, 1000);
        }

        console.log('visibilitychange', now);
    }, false);
</script>
Randallmaster
Dzięki za kod smile.gif, testuję i jedyne co znalazłem to jedną sekundę gubi podczas powrotu z innej zakładki ale to już poprawię smile.gif Wielkie dzięki!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.