<script type="text/javascript">
function countDown(id, end, cur){
this.container = document.getElementById(id);
this.endDate = new Date(end);
this.curDate = new Date(cur);
Поскольку функция не вызывается как метод какого-либо объекта, а также с call()
или apply()
, ее ключевое слово this будет ссылаться на глобальный объект.Таким образом, вышеприведенное эффективно создает глобальные переменные для container, endDate и curDate.
var context = this;
Пожалуйста, запишите 1000 раз: это ключевое слово не является контекстом (и не имеет к нему никакого отношенияscope).
...
context.curDate.setSeconds(context.curDate.getSeconds()+1);
Как уже обсуждалось, переменная "context" является ссылкой на глобальный объект, она задается тем, как вы вызываете функцию.Итак, вы обращаетесь к глобальным переменным здесь.
...
// Call recursively
setTimeout(update, 1000);
Вот ваша проблема.Это вызовет обновление через около 1 секунды.Чем дольше работает ваш счетчик, тем более неточным он станет (он всегда будет дрейфовать позже).
Вы должны каждый раз получать новый объект даты, смотреть мс, а затем вызывать следующий таймаут сразу после следующегополная секунда (дайте ей от 30 до 50 мс, чтобы убедиться, что это только после, а не раньше).Таким образом, ваш счетчик никогда не выйдет из строя, и даже если он есть, он будет исправляться каждый раз, когда его вызывают.
И убедитесь, что вы каждый раз рассчитываете полный отсчет, так что если есть задержканесколько секунд вы снова догоняете.