Таймер обратного отсчета JavaScript, использующий серверное время

Я пытаюсь создать таймер обратного отсчета, основанный на времени на сервере.

Изначально сервер установил оставшееся время и просто сделал setTimeout на 1 секунду, что уменьшило время.

Я нашел 2 проблемы с этим:

  1. Сервер устанавливает время до рендеринга клиентской страницы и запуска JavaScript с задержкой. Величина задержки зависит от скорости интернет-соединения пользователя и компьютера/JavaScript-движка.
  2. Я думаю, что setTimeout из 1 секунды, возможно, немного отставали на более медленных компьютерах.

Я изменил его, чтобы сервер устанавливал время окончания, а JavaScript на клиенте брал время (в формате UTC) и вычислял оставшееся время. Затем он будет делать это при каждом обратном вызове setTimeout. Это делает время и обратный отсчет идеальными. Если у клиента быстрый компьютер/движок JavaScript, таймер остается на странице. Если компьютер/JavaScript-движок работает медленнее, вы можете заметить, что здесь и там пропущена секунда, но время никогда не сбивается.

Я нашел 1 проблему с этим методом до сих пор:

  1. Часы каждого клиента могут быть разными.

Таким образом, оставшееся время может составлять пару секунд, или 30 секунд, или даже выходных дней, если время клиента неправильно установлено на его компьютере.

Есть ли способ, чтобы оставшееся время было точным в зависимости от даты окончания сервера?


person Josh Close    schedule 19.12.2010    source источник


Ответы (1)


Я не знаю, какое разрешение вам нужно, но, учитывая задержку рендеринга сети и страниц, будет невозможно получить соглашение между клиентом и сервером намного быстрее, чем за секунду. Я бы посоветовал вам проводить опрос ajax каждые 5 или 10 секунд и соответствующим образом настраивать таймер. Существует также comet, который по сути представляет собой "обратный" ajax, способный ускорить время. клиенту. Но в любом случае у вас все еще есть задержки сети и рендеринга, с которыми нужно бороться.

person Richard H    schedule 19.12.2010