Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Скрипт "таймера" отстает, если свернуть браузер или переключиться на другую вкладку (https://javascript.ru/forum/misc/72437-skript-tajjmera-otstaet-esli-svernut-brauzer-ili-pereklyuchitsya-na-druguyu-vkladku.html)

Walk 29.01.2018 12:30

Скрипт "таймера" отстает, если свернуть браузер или переключиться на другую вкладку
 
Здравствуйте

Есть довольно простой js-скрипт, аналог таймера, который каждую секунду изменяет цифру на экране:

var time = 1000;
var start_time = 1000; 
// ...другие параметры

            function timer() {
                setTimeout(
                    function run() {
                            second++;
                            view(); // обновляет информацию на экране
                            setTimeout(run, time);
                        }
                    },
                    start_time);
            }


При открытии/обновлении страницы php получает данные о текущем времени, и дальше уже отрабатывает js.

Заметил, что если скрыть браузер, или переключиться на другие вкладки, а потом (минут через 5-10+) вернуться на страницу с таймером, и обновить страницу - то время на несколько десятков секунд "прыгнет" вперед.

Получается, что в этом случае js как бы подлагивает, и считает "время" медленней реального. Знакомый программист, разбирающийся в js сказал, что с этим ничего не поделать. Это так?

рони 29.01.2018 12:53

Walk,
секунды надо менять, согласно прошедшему времени, а не относительно сколько раз сработает таймер.
меняйте логику в строке 8.

рони 29.01.2018 12:59

Walk,
строка 62, там обратный таймер, но логика таже, изменить вычитание несложно, чтоб время вперёд шло
https://javascript.ru/forum/dom-wind...tml#post476408

Walk 29.01.2018 13:45

Цитата:

Сообщение от рони (Сообщение 476513)
Walk,
строка 62, там обратный таймер, но логика таже, изменить вычитание несложно, чтоб время вперёд шло
https://javascript.ru/forum/dom-wind...tml#post476408

Спасибо за пример.

Нашел немного другой - протестировал - вроде как работает без задержек:

var second = 0;
var interval = 1000;
var expected = Date.now() + interval;

    setTimeout(step, interval);
    
    function step() {
        var dt = Date.now() - expected;
        if (dt > interval) {
            alert('Непредвиденная ошибка'); // ошибка которой не должно быть
        } else {
            
            // выполняем нужный код

            expected += interval;
            setTimeout(step, Math.max(0, interval - dt));
        }
    }

рони 29.01.2018 15:09

Walk,
вам виднее ...


Часовой пояс GMT +3, время: 18:51.