2013-10-07 4 views
2

Следующий сценарий подсчитывается, но он не прекращает отсчет, когда он достигает конечного времени. Когда он достигнет нуля, он начнется снова с 60:00 до 0 (еще один час). Когда я пропустить частьТаймер Javascript не останавливается

$time = str_replace(' ', 'T', $db[time]); 

и сделать это так:

var end = new Date('<?=$db[time]?>'); 

Счетчик правильно остановить, но тогда работа счетчик обыкновение в IE или Firefox только в Chrome.

Кто-нибудь знает, как остановить этот счетчик: S Thanx!

$db[time] = Timestamp field in the database (2013-10-03 11:32:39) 

Сценарий:

$time = str_replace(' ', 'T', $db[time]); 

Java скрипт

<script> 
var end = new Date('<?=$time?>'); 
var _second = 1000; 
var _minute = _second * 60; 
var _hour = _minute * 60; 
var _day = _hour * 24; 
var timer; 

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

     clearInterval(timer); 
     document.getElementById('countdown').innerHTML = 'ITS NOW TIME!</font><BR><BR>';     
     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 = '<font color="orange">' + minutes + ':'; 
    document.getElementById('countdown').innerHTML += '<font color="orange">' + seconds + ' minutes</font>'; 
} 

timer = setInterval(showRemaining, 1000); 
</script> 
+0

Проверить это на jsbin: http://jsbin.com/agAvEbU/1/edit Этот код работает нормально. Проблема должна быть где-то еще – devnull69

+0

См. Комментарий Katana314 о том, что вы используете 'innerHTML' с искаженным HTML. Каждое отдельное присваивание innerHTML должно содержать приветственный HTML, иначе браузер изменит ваш HTML так, что он будет «приветствован» (или искажен в отношении ваших намерений) после этого – devnull69

ответ

1

Я предлагаю вам использовать

var countInterval = setInterval(function() { countdown(secondsRemaining); },1000) вместо этого.

Таким образом, вам не придется играть с объектами даты или времени. Просто держите счет внутри countdown() и clearInterval(countInterval), как только вы достигнете 60.

+0

. Вы действительно предлагаете заменить ссылку на функцию строкой это должно быть eval() - до запуска? – devnull69

+0

Я предлагаю рассчитать оставшиеся секунды на бэкэнд, где он независим от браузера, и сделать простой setInterval в интерфейсе. – user2793390

+0

Но лучше всего использовать ссылку на функцию в качестве первого параметра 'setInterval' ... который OP уже сделал. Но вы заменили его на строку, которая считается плохой практикой. – devnull69

1

Я немного подозрительно отношусь к вашему внутреннему использованию HTTML. Где этот скрипт находится в HTML? У меня такое чувство, что он переоценивается после установки innerHTML. Вы можете проверить теорию, поставив оператор console.log("Started!") рядом с setInterval.

Кроме того, смотрите здесь:

document.getElementById('countdown').innerHTML = 'ITS NOW TIME!</font><BR><BR>'; 

Вы «настройка» (замену) innerHTML элемента так будет содержать: текст, а затем тег крупного шрифта. Это может испортить ваш DOM. Наконец, вы не должны дважды устанавливать innerHTML в две строки - установите один раз в функции, возможно, на основе переменной.

(Для уточнения: Использование innerHTML сама по себе не самое худшее, - но с искаженной HTML или путем регулировки элемента слишком высоко в иерархии, это может иметь непредсказуемые последствия)

Смежные вопросы