Я хочу создать таймер обратного отсчета, который выглядит как счетчик кадров в секунду для веб-страницы ... после нескольких часов потраченного времени я не могу понять, что не так ..... помогите
<script>
var myvar = setInterval(function () { startTimer() }, 1000);
function startTimer() {
var presentTime = 17 + ":" + 00;
var timeArray = presentTime.split(/[:]+/);
var m = timeArray[0];
var s = checkSecond((timeArray[1] - 1));
if (s == 59) {
m = m - 1
}
//if (m<0){alert('timer completed')}
var button2 = document.createElement("Button2");
var interval = m + s;
button2.innerHTML = Math.round(interval);
button2.style = "top:0; left:0rem; height:10% ;color: black; background-color: #ffffff;position:fixed;padding:20px;font-size:large;font-weight: bold;";
setTimeout(startTimer, 1000);
document.body.appendChild(button2);
}
function checkSecond(sec) {
if (sec < 10 && sec >= 0) {
sec = "0" + sec
}; // add zero in front of numbers < 10
if (sec < 0) {
sec = "59"
};
return sec;
}
</script>
На самом деле, после беглого взгляда выясняется, что вы жестко запрограммировали время как 17:00 в вашем startTimer, поэтому часы никогда не обновятся. Почему вы жестко запрограммировали это значение и не пытаетесь обновлять его каждую секунду?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я могу найти три ошибки, которые мешают правильному выполнению вашего кода.
Несколько таймеров
Во-первых, поскольку вы вызываете как setInterval во внешней области видимости, так и setTimeout после каждой выполненной итерации, вы в конечном итоге получите множество нежелательных экземпляров таймера, которые будут делать за вас сумасшедшие подсчеты.
Я рекомендую вам отказаться от любого из них и придерживаться только одного из них.
В моем примере я придерживался setInterval, так как вы все равно выполняете один и тот же метод снова и снова.
Инициализация
Поскольку presentTime объявлен внутри функции startTimer, он будет постоянно перезаписываться на 17 + ":" + 00 (в результате получается "17:0", кстати).
Это решается путем объявления его во внешней области видимости.
Вспоминая изменения
Наконец, вам нужно сохранить текущее состояние presentTime после внесения изменений. Простое добавление presentTime = [m,s].join(":"); в конец startTimer() решает эту проблему.
var presentTime = "17:00";
function startTimer() {
var timeArray = presentTime.split(/[:]+/);
var m = timeArray[0];
var s = checkSecond((timeArray[1] - 1));
if (s == 59) {
m = m - 1
}
var button2 = document.createElement("Button2");
var interval = s;
button2.innerHTML = m + ":" + s;
button2.style = "top:0; left:0rem; height:10% ;color: black; background-color: #ffffff;position:fixed;padding:20px;font-size:large;font-weight: bold;";
document.body.appendChild(button2);
presentTime = [m,s].join(":");
}
function checkSecond(sec) {
if (sec < 10 && sec >= 0) {
sec = "0" + sec
}; // add zero in front of numbers < 10
if (sec < 0) {
sec = "59"
};
return sec;
}
var interval = setInterval(startTimer, 1000);
спасибо, магнус, за подробную информацию о том, где я ошибся ... не могли бы вы помочь мне еще раз в получении двоеточия между mm: ss при обновлении на странице ...
Конечно. Вам просто нужно вставить button2.innerHTML = Math.round(m+s); в button2.innerHTML = m + ":" + s;, и все готово. Я обновлю ответ этим кодом.
Отметьте мой ответ как принятый, если вы считаете, что это жизнеспособное решение вашей проблемы.
Что именно делает код, который отличается от предполагаемого результата?