2012-01-13 2 views
2

У меня есть полное приложение ajax. Я использую приведенный ниже код для обновления времени каждую минуту. Но если я держу браузер открытым в течение> 10 минут, браузер становится неактивным/медленным. Предложите лучший код.Предлагайте способ обновлять время каждую минуту

function tick() 
{ 
    var d = new Date(); 
    var time = padNumber(d.getHours(),2)+':'+padNumber(d.getMinutes(),2); 
    $('#WeatherBoLfTime').html(' '+time); 
    t = setInterval('tick()',60000); 
} 

$(document).ready(function(){ 
    tick(); 
}) 
+2

См. Http://bonsaiden.github.com/JavaScript-Garden/#other.timeouts, в частности «Скрытое использование' eval' » – Zirak

+0

Если вы полагаетесь только на setTimeout, код сломается, когда пользователь переведет свой компьютер в режим сна, а затем снова включит его. Смотри ниже; вам нужно больше, чем setTimeout! – frenchie

ответ

5

Проблема заключается в том, что вы вызываете setInterval много раз и никогда не очищая ни один из них. Поэтому через некоторое время у вас много интервальных обратных вызовов, работающих примерно в одно и то же время.

Изменить

t = setInterval('tick()',60000); 

в

t = setTimeout(tick,60000); 

Когда я первый начал кодирования JavaScript я снес веб-сервер Lycos с AJAX звонки, потому что я сделал ту же ошибку :-)

Обратите внимание: поскольку вы показываете фактическое время, вы должны использовать гораздо более короткий таймер, чем 1 минуту. Если я приземлюсь на вашей веб-странице в 13:42:30, время не будет обновляться до ~ 13: 43: 30. Чтобы синхронизация со временем машины, вы, вероятно, захотите установить таймер на 1000.

+2

Это приведет к тому, что таймер будет работать только один раз. – Johan

+4

@Johan: нет, потому что это рекурсивный вызов таймера. Пожалуйста, прочитайте код правильно. –

+0

Заметил, мой плохой! – Johan

3

setInterval() устанавливает интервал. Вам нужно только настроить его один раз, он будет вызываться каждые 60000 мс автоматически. setTimeout() - это тот, который вы должны настроить каждый раз снова.

+0

Это сломается, когда пользователь переведет свой компьютер и снова включит его. Смотри ниже. – frenchie

1

Как указывали другие, вы каждый раз создаете новый интервал. Переместите его вне вашей функции.

function tick() 
{ 
    var d = new Date(); 
    var time = padNumber(d.getHours(),2)+':'+padNumber(d.getMinutes(),2); 
    $('#WeatherBoLfTime').html(' '+time); 
} 

$(document).ready(function(){ 
    t = setInterval(tick,60000); 
}) 

Редактировать: Я медленный, и другие ответы кажутся обновленными. Итак, этот бесполезен сейчас :)

+0

Это сломается, когда пользователь уложит свой компьютер в режим сна, а затем снова включит его. Смотри ниже. – frenchie

+0

@frenchie: если setInterval фактически перестает работать полностью (что испортит все методы), тогда это сработает. Время будет устаревать потенциально до минуты, пока галочка не запустится снова, но когда это произойдет, время будет правильно установлено (поскольку оно получает время каждый раз, когда оно отображается, а не просто увеличивает то, что уже есть). – Chris

+0

@frenchie: Не было никакого упоминания о том, что он должен работать, когда клиент ложится спать. И мой ответ работает на данный вопрос. Как и все остальные. Не было необходимости в downvote .. – Spitz

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