#javascript #html #timer #countdown
#javascript #HTML #таймер #обратный отсчет
Вопрос:
Я пытался заставить этот обратный отсчет javascript работать и получил обратный отсчет от 3 до 1, однако я не могу понять, почему он не доходит до 0?
Почему он останавливается на 1 и как мне заставить его полностью отсчитывать время?
<body>
<p>Time left: <span id="time">3</span> seconds.</p>
<p><a href="#" onclick="play()">Play</a> <a href="#" onclick="pause()">Pause</a></p>
<script>
var time = 3,
timeElement = document.getElementById('time'),
timer = null;
var updateTimer = function() {
timeElement.innerHTML = time--;
if (time === 0) {
clearInterval(timer);
}
}
function play() {
timer = setInterval(updateTimer, 1000);
return false;
}
function pause() {
clearInterval(timer);
return false;
}
</script>
</body>
Вы также можете протестировать JsFiddle, который я сделал здесь: http://jsfiddle.net/Vg4kQ/
Спасибо за вашу помощь!
Ответ №1:
Используйте префикс вместо постфиксного уменьшения:
timeElement.innerHTML = --time;
Это связано с семантическими различиями между префиксными и постфиксными операторами инкремента / декремента. Они оба увеличивают / уменьшают значение переменной, как и ожидалось, но они не вычисляются до того же значения при использовании в качестве выражений.
Приращение / уменьшение префикса оба работают так, как и ожидало бы большинство людей: они корректируют значение переменной, а затем вычисляют новое значение.
var x = 5;
console.log( x); // 6
console.log(x); // 6
Постфиксные операторы немного менее интуитивно понятны. Они по-прежнему изменяют значение таким же образом, но при использовании в качестве выражений они вычисляют значение переменной до ее изменения.
var x = 5;
console.log(x ); // 5
console.log(x); // 6
В вашем коде при time
достижении 0 выражение postfix по-прежнему выдает предыдущее значение, 1, что делает timeElement
значение ‘s по-прежнему отображаемым 1, но все равно завершает цикл. Преобразование выражения для использования префиксного уменьшения устраняет эту проблему.
В качестве альтернативы, вы всегда можете просто разделить его на два оператора.
time--;
timeElement.innerHTML = time;
Комментарии:
1. время = 3, уменьшается до 2, выводит 2. время = 2, уменьшается до 1, выводит 1. время = 1, уменьшается до 0, выводит 0, завершается