странная ошибка в моем секундомере

0

ПРЕДЫДУЩИЙ БУГ: В моем секундомере здесь, если я приостанавливаюсь и возобновляюсь быстро даже до первой секунды, он не обновляет seconds в секундомере. Итак, чтобы исправить это, я сделал:

            if (milliseconds >= 1000){
                milliseconds %= 1000;
                seconds++;
            }

NEW BUG: Теперь он обновляет второй по порядку. Однако, если я просто запустил секундомер (без паузы), он пропускает первую секунду и прямо делает это 2 секунды. 1 секунда никогда не отображается. (Пожалуйста, попробуйте сами, если вы не можете понять, что я говорю).

jsFiddle

Как это исправить?

  • 3
    Я не могу дублировать проблемное поведение, которое вы описываете. То есть в демке из твоей первой ссылки я быстро сделал паузу и перезапустился и все заработало правильно. (Я пытался несколько раз.)
  • 0
    @nnnnnn Просто запустите секундомер и наблюдайте за секундной частью.
Показать ещё 5 комментариев
Теги:

1 ответ

3
Лучший ответ
  1. Никогда не забывайте, что radix в parseInt

    var stringToInt = parseInt(yourString, 10);
    
  2. Вы начинаете интервал, но в какой-то момент вы освобождаете только тайм-аут. Вместо этого используйте clearInterval

    clearInterval(timeUpdate);
    

EDIT: проблема секунд: пусть проверяет ваш код на timeElapsed == 1000. Сначала вы устанавливаете секунды для

    seconds = parseInt(timeElapsed / 1000, 10) + prev_seconds;

что приводит к seconds == 1

Затем вы добавляете еще 1 к секундам, если milliseconds >= 1000

    if (milliseconds >= 1000){
       milliseconds %= 1000;
       seconds++;
    }

То же самое происходит и с часами и часами.

EDIT2: проблема паузы/возобновления. Позвольте приостановить мнимые часы в 01: 437 и возобновить его.

timeElapsed начнет отсчет в 0. После 563 миллисекунд он должен переключиться на 2 секунды и 000 миллис. Но что происходит?

    seconds = parseInt(timeElapsed / 1000, 10) + prev_seconds;

Это приведет к seconds == 1 для timeElapsed == 563. Правильно это должно быть больше похоже на

    seconds = Math.floor((parseInt(timeElapsed, 10) + prev_milliseconds) / 1000) + prev_seconds;

То же самое, очевидно, рассчитано на минуты и часы.

В результате FIDDLE

  • 0
    Каково значение добавления radix как 10 ?
  • 0
    @RahulDesai - До ECMAScript 5, если строка начиналась с «0», основание принималось за 8 (восьмеричное), что вызывало всевозможные проблемы. По сей день, если строка начинается с «0x», основание будет 16 (шестнадцатеричное). Лучше определить это, просто чтобы быть в безопасности. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню