Счетчик не живой

Мой следующий скрипт работает: но с одной проблемой: он не ведет обратный отсчет. Это дает правильный вывод (время до даты), но не обновляется автоматически.

Кто-нибудь сейчас что-то не так?

Главное, этот таймер обратного отсчета работает с серверным временем (вот почему post и time.php).

        <script>
var end = new Date('10/7/2013 7:0 PM');

var _second = 1000;
var _minute = _second * 60;
var _hour = _minute * 60;
var _day = _hour * 24;
var timer;

var now;
function startShowRemaining(strnow) {
now = new Date(strnow);
showRemaining();
}
function showRemaining() {
//var now = new Date(strnow);
    var distance = end - now;
    if (distance < 0) {

        clearInterval(timer);
        document.getElementById('countdown').innerHTML = 'EXPIRED!';

        return;
    }
    var days = Math.floor(distance / _day);
    var hours = Math.floor((distance % _day) / _hour);
    var minutes = Math.floor((distance % _hour) / _minute);
    var seconds = Math.floor((distance % _minute) / _second);

    document.getElementById('countdown').innerHTML = days + 'days ';
    document.getElementById('countdown').innerHTML += hours + 'hrs ';
    document.getElementById('countdown').innerHTML += minutes + 'mins ';
    document.getElementById('countdown').innerHTML += seconds + 'secs';
}

timer = setInterval(showRemaining, 1000);

function postRequest(strURL) {
var xmlHttp;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    var xmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
    var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttp.open('POST', strURL, true);
xmlHttp.setRequestHeader('Content-Type', 
   'application/x-www-form-urlencoded');
xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4) {
        startShowRemaining(xmlHttp.responseText);
    }
}
xmlHttp.send(strURL); }
postRequest('time.php');      
</script>
<div id="countdown"></div>

TIME.PHP:

print date("m/d/Y, G:i:s");

1 ответ

Решение

Проблема в том, что вы опрашиваете серверное время только один раз. Ты звонишь showRemaining снова и снова, но now время никогда не изменится, поэтому выход никогда не изменится.

Если вам нужно использовать серверное время, вам нужно отправить запрос, который вы отправляете в postRequest каждый раз showRemaining называется и использовать его для now:

Часть этого поста была удалена, так как была неправильной

Вы можете найти пример в этом jsfiddle, где я заменил содержимое postRequest с заглушкой, чтобы использовать время клиента вместо вызова Ajax (так как у меня нет доступа к вашему time.php).

Конечно, такие повторные запросы к серверу совершенно неэффективны, поэтому вам действительно стоит подумать об использовании часов клиента. Вы также можете рассмотреть возможность использования времени сервера один раз, а затем использовать часы Javascript, чтобы добавить к этому времени.

Другие вопросы по тегам