Обновление элемента кнопки как таймера обратного отсчета через javascript

Я хочу создать таймер обратного отсчета, который выглядит как счетчик кадров в секунду для веб-страницы ... после нескольких часов потраченного времени я не могу понять, что не так ..... помогите

<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>

Что именно делает код, который отличается от предполагаемого результата?

Robin Zigmond 09.01.2019 22:57

На самом деле, после беглого взгляда выясняется, что вы жестко запрограммировали время как 17:00 в вашем startTimer, поэтому часы никогда не обновятся. Почему вы жестко запрограммировали это значение и не пытаетесь обновлять его каждую секунду?

Robin Zigmond 09.01.2019 23:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу найти три ошибки, которые мешают правильному выполнению вашего кода.

Несколько таймеров

Во-первых, поскольку вы вызываете как 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 при обновлении на странице ...

Dhaval Verma 09.01.2019 23:16

Конечно. Вам просто нужно вставить button2.innerHTML = Math.round(m+s); в button2.innerHTML = m + ":" + s;, и все готово. Я обновлю ответ этим кодом.

Magnus 09.01.2019 23:27

Отметьте мой ответ как принятый, если вы считаете, что это жизнеспособное решение вашей проблемы.

Magnus 10.01.2019 00:04

Другие вопросы по теме