Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.12.2014, 21:42
Интересующийся
Отправить личное сообщение для leshiple Посмотреть профиль Найти все сообщения от leshiple
 
Регистрация: 09.12.2014
Сообщений: 21

Быстрая первая секунда в таймере
Первая секунда таймера слишком быстро проходит. Сразу после нажатия кнопки "Старт", без паузы отображается значение меньше чем было указано. Из-за чего это? И как исправить?
<!DOCTYPE html>
<html>
<head lang="ru">
    <meta charset="UTF-8">
    <title></title>
    <style>
         input {
                 width: 30px;
                 text-align: center;
         }

        button {
                 width: 53px;
        }

    <style>
</head>
<body>
    <div id="tim">
        <input id = "hours" type="text" placeholder="00"/>
        <input id = "minutes" type="text" placeholder="00"/>
        <input id = "seconds" type="text" placeholder="00"/>
    </div>
    <button id="start">Старт</button>
    <button id="stop">Стоп</button>
    <script>
          
var start = document.getElementById("start");
var stop = document.getElementById("stop");
var setIntervalTimer;
var counter;
var rightToStart = true;

var hours = document.getElementById("hours");
var minutes = document.getElementById("minutes");
var seconds = document.getElementById("seconds");




var timer = function() {
    if (rightToStart) {
        var hInput = +hours.value;
        var mInput = +minutes.value;
        var sInput = +seconds.value;
        var today = new Date();
        var endTime = new Date(today.getFullYear(),
            today.getMonth(),
            today.getDate(),
            today.getHours() + hInput,
            today.getMinutes() + mInput,
            today.getSeconds() + sInput);

        if (hInput != 0 || mInput != 0 || sInput != 0) {
            counter = function () {
                var nowTime = new Date();
                var delta = endTime - nowTime;

                var h = Math.floor(delta / 3600000);
                delta = delta - h * 3600000;

                var m = Math.floor(delta / 60000);
                delta = delta - m * 60000;

                var s = Math.floor(delta / 1000);

                hours.value = format(h, 2);
                minutes.value = format(m, 2);
                seconds.value = format(s, 2);


            }
            setIntervalTimer = setInterval(counter, 50);
            rightToStart = false;
        }

}
}

function format(num, maxNumbers) {
    var numStr = num + '';
    while (numStr.length < maxNumbers) {
        numStr = '0' + numStr;
    }

    return numStr;
}

var clear = function(){
    rightToStart = true;
    clearInterval(setIntervalTimer);
}

start.addEventListener("click", timer);
stop.addEventListener("click", clear);
    </script>
</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 24.12.2014, 21:53
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

1 секунда это 1000 миллисекунд. А у вас стоит 50 миллисекунд.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #3 (permalink)  
Старый 24.12.2014, 22:21
Интересующийся
Отправить личное сообщение для leshiple Посмотреть профиль Найти все сообщения от leshiple
 
Регистрация: 09.12.2014
Сообщений: 21

Я знаю, но ведь у меня время берется машинное и с частотой 50 миллисекунд проверяется разность времени между началом запуска таймера и текущим временем. Если установить в 1000 миллисекунд, то не отображается значение в 59 секунд, так как первый запуск функции произойдет через 1 секунду + погрешность.

Проблема только в первой секунде, в дальнейшем все хорошо. Она у меня получается 50 миллисекунд + время исполнения кода. Мне необходимо установить setTimeout() с задержкой определенной эмпирическим путем. Если время исполнения кода + 50 миллисекунд больше 500, то значение округляется вверх и значение 59 не выводится. Время исполнения кода всегда разное. Запутался.
Придется жертвовать первой секундой?

Последний раз редактировалось leshiple, 24.12.2014 в 22:51.
Ответить с цитированием
  #4 (permalink)  
Старый 25.12.2014, 07:37
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Первый раз функции в таймере выполнится спустя 50мс послезапуска. Соответственно от первой секунды останется 950мс и будет показано целое количество оставшихся секунд. Плюс у тебя там не указаны миллисекунды в endTime и поэтому будет еще одна погрешность на количество мс которые обнулились. В общем, компенсируй первую секунду и указывай миллисекунды:
<!DOCTYPE html>
<html>
<head lang="ru">
    <meta charset="UTF-8">
    <title></title>
    <style>
         input {
                 width: 30px;
                 text-align: center;
         }

        button {
                 width: 53px;
        }

  </style>
</head>
<body>
    <div id="tim">
        <input id = "hours" type="text" placeholder="00"/>
        <input id = "minutes" type="text" placeholder="00"/>
        <input id = "seconds" type="text" placeholder="00"/>
    </div>
    <button id="start">Старт</button>
    <button id="stop">Стоп</button>
    <script>
          
var start = document.getElementById("start");
var stop = document.getElementById("stop");
var setIntervalTimer;
var counter;
var rightToStart = true;

var hours = document.getElementById("hours");
var minutes = document.getElementById("minutes");
var seconds = document.getElementById("seconds");




var timer = function() {
    if (rightToStart) {
        var hInput = +hours.value;
        var mInput = +minutes.value;
        var sInput = +seconds.value;
        var today = new Date();
        var endTime = new Date(today.getFullYear(),
            today.getMonth(),
            today.getDate(),
            today.getHours() + hInput,
            today.getMinutes() + mInput,
            today.getSeconds() + sInput + 1,
            today.getMilliseconds() );

        if (hInput != 0 || mInput != 0 || sInput != 0) {
            counter = function () {
                var nowTime = new Date();
                var delta = endTime - nowTime;

                var h = Math.floor(delta / 3600000);
                delta = delta - h * 3600000;

                var m = Math.floor(delta / 60000);
                delta = delta - m * 60000;

                var s = Math.floor(delta / 1000);

                hours.value = format(h, 2);
                minutes.value = format(m, 2);
                seconds.value = format(s, 2);


            }
            setIntervalTimer = setInterval(counter, 50);
            rightToStart = false;
        }

}
}

function format(num, maxNumbers) {
    var numStr = num + '';
    while (numStr.length < maxNumbers) {
        numStr = '0' + numStr;
    }

    return numStr;
}

var clear = function(){
    rightToStart = true;
    clearInterval(setIntervalTimer);
}

start.addEventListener("click", timer);
stop.addEventListener("click", clear);
    </script>
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 25.12.2014, 20:05
Интересующийся
Отправить личное сообщение для leshiple Посмотреть профиль Найти все сообщения от leshiple
 
Регистрация: 09.12.2014
Сообщений: 21

jsnb, Спасибо тебе.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Slideshow - загружается только первая картинка Freia Ваши сайты и скрипты 2 04.02.2014 08:53