Независимый отсчет в Javascript - PullRequest
0 голосов
/ 21 января 2019

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

<div class="js-countdown" data-enddate="2019/1/21 15:54"></div>

мой JS:

var $clock = $('.js-countdown');
var d = new Date(Date.parse($clock.data("enddate").replace(/ /g, "T")));
  $clock.countdown(d, function(event) {
    $(this).text(
      event.strftime('%D days %H:%M:%S')
    );
  });
</script>

Это действительно зависит от часов пользователя, например, когда пользователь меняет время или часы не синхронизированы, таймер обратного отсчета не работает должным образом.
Время сервера: 13:54
Время пользователя: 13:54
Дата окончания: 15:54, затем обратный отсчет показывает: 2 (часы): 00 (минуты) . Но если:
Время сервера: 13:54
Время пользователя: 14:54 (оно намеренно изменилось)
Дата окончания: 15:54, затем обратный отсчет показывает 1 (часы): 00 (минуты) , как я хочу, это будет 2 (часы): 00 (минуты) . Как я могу изменить это поведение? Моя цель - добиться независимого таймера обратного отсчета. Не могли бы вы дать мне подсказки об этом?

Редактировать

Здесь , дата обновления таймера. Разумно ли отправлять запрос каждый раз, когда происходит событие обновления?

1 Ответ

0 голосов
/ 23 января 2019

Я не уверен, что это лучший подход, но сейчас он работает нормально.

var now;
var it = 1;
now = new Date(Date.parse('@DateTime.UtcNow.ToString("u")'.replace(/ /g, "T")));
setInterval(setAndSyncTime, 1000);
function setAndSyncTime() {
    var t1 = new Date();
    var t2 = now;
    var t3 = Math.abs(t1 - t2);
    if (t3 > 2000) {
        if (it === 10) {
            it = 0;
            $.ajax({
                url: '/SyncTime',
                type: 'get',
                success: function (response) {
                    now = new Date(Date.parse(response.replace(/ /g, "T")));
                }
            });
        } else {
            now = now.setSeconds(now.getSeconds() + 1);
            now = new Date(now);
        }
    } else {
        now = now.setSeconds(now.getSeconds() + 1);
        now = new Date(now);
    }
    it++;
}

и

public virtual JsonResult SyncTime()
{
    return Json(DateTime.UtcNow.ToString("u"), JsonRequestBehavior.AllowGet);
}
...