Как сделать таймер на js

Обновлено: 05.07.2024

Вывод значений нашего таймера будет осуществляться через id в соответствующие элементы span.

Программирование логики таймера таймера (timer.js)

В теле функции initializeTimer мы инициализируем наш таймер и пишем логику изменений чисел в случае когда одно из них становится равным нулём:

Теперь необходимо вызвать функцию с нашим таймером:

Осталось только описать функцию setTimePage, которая выводит значения нашего таймера в соответствующие элементы span

Настройка таймера обратного отсчёта

Нужно лишь установить нужную дату окончания акции (таймера). Это делается через переменную:

var endDate = new Date(2018,2,28);

Порядок задания значения даты: год, месяц, день. Нумерация месяца начинается с нуля!

Таймер и есть обратный отсчет времени! Обратный отсчет сделаем в секундах, что такое таймер, обратный таймер. Скрипт таймера, пример работы и конечно же можно будет скачать полностью рабочий скрипт данного таймера!
01.11.2020

Вообще, если честно, то таймер и есть понятие, которое и включает в себя обратный отсчет! Таймер = обратный отсчет.

А вот таймер, который считает вперед называется таймер реального времени! Ну, с определениями закончили!

И первый таймер, который сработал вы уже видели! Где показывается информация, что после загрузки страницы прошло 5 секунд!

Таймер javascript с запуском отсчета по нажатию кнопки.

Мы изменим привычных вещей и в первом пункте поставим пример работы скрипта обратного отсчета в секундах! Для запуска данного таймера, нужно нажать кнопку Начать отсчет времени , конечно же можно не использовать вывод поля, что время закончилось, это очень просто настраивается в скрипте!

Скрипт таймера обратного отсчета времени с кнопкой

Отправим по нажатию на кнопку число 5 - время через которое кончится отчет.

Начать отсчет времени

И напишем коротенький скрипт, который и будет обрабатывать -что у нас есть в "show_2".

Логика скрипта таймера на javascript:

Пока в переменной(peremennaya) ничего нет - ничего не происходит. нажимаем кнопку запустить - отправляем 5 секунд

Обновляем каждую секунду. и как только получаем значение переменной(peremennaya) отнимаем от неё единицу.

Пока переменная не равно нулю - процесс продолжается.

Как только переменная равна нулю выводим - время кончилось и отправляем в "show_2" - stop timer

Если в "show_2" - stop timer - ничего не делаем.

if(peremennaya !== 'stop timer' )

peremennaya = peremennaya - 1;

alert("Время кончилось!"); document.getElementById("show_2").innerHTML = 'stop timer';

Готовый код таймера на javascript

Если вам требуется любое другое время, установить для таймера, то в коде в строке с innerHTML = 5 меняем число на то, через сколько ваш таймер должен срабатывать.

Теперь соберем весь код таймера в одном месте:

Начать отсчет времени

Запуск таймера после загрузки страницы javascript

Описание скрипта : запуск таймера после загрузки страницы javascript

Все методы для Date() можно взять отсюда.
Не буду заново рассказывать код, который мы в прошлый раз сделали.

Приведу лишь его код:

var data = new Date();

var time = data.getHours() + ":" + data.getMinutes() + ":" + data.getSeconds();

Внутри функции нужно сделать условие такого вида:

Вы наверное обратили внимание, что к минутам мы прибавили единицу. Это как раз и будет наша минута.

В этом руководстве рассматриваются традиционные методы, доступные в JavaScript для асинхронного выполнения кода по истечении заданного периода времени или через регулярный интервал (например, заданное количество раз в секунду), обсуждаются их полезные свойства и рассматриваются присущие им проблемы. .

Необходимые условия: Базовая компьютерная грамотность, достаточное понимание основ JavaScript.
Цель: Понимание асинхронных циклов и интервалов, и то как их можно использовать.

Введение

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

setTimeout() Выполняет указанный блок кода один раз по истечении указанного времени setInterval() Выполняет указанный блок кода несколько раз с определённым интервалом между каждым вызовом. requestAnimationFrame() Современная версия setInterval (). Выполняют указанный блок кода перед тем, как браузер в следующий раз перерисовывает отображение, позволяя запускать анимацию с подходящей частотой кадров независимо от среды, в которой она выполняется.

Асинхронный код, установленный этими функциями, выполняется в основном потоке (по истечении указанного им таймера).

Важно знать, что вы можете (и часто будете) запускать другой код до выполнения вызова setTimeout () или между итерациями setInterval (). В зависимости от того, насколько интенсивно используются эти операции для процессора, они могут ещё больше задержать выполнение асинхронного кода, поскольку любой асинхронный код будет выполняться только после того, как станет доступен основной поток. (Другими словами, когда стек пуст.) вы узнаете больше по этому вопросу по мере изучения этой статьи.

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

setTimeout()

Как мы ранее отметили, setTimeout () выполняет определённый блок кода один раз по истечении заданного времени. Принимает следующие параметры:

NOTE: Указанное время (или задержка) не является гарантированным временем выполнения, а скорее минимальным временем выполнения. Обратные вызовы, которые вы передаёте этим функциям, не могут выполняться, пока стек в основном потоке не станет пустым.

Как следствие, такой код, как setTimeout (fn, 0), будет выполняться, как только стек будет пуст, а не сразу. Если вы выполните такой код, как setTimeout (fn, 0), но сразу после выполнения цикла, который насчитывает от 1 до 10 миллиардов, ваш колбэк будет выполнен через несколько секунд.

Указанные вами функции не обязательно должны быть анонимными. Вы можете дать своей функции имя и даже определить её где-нибудь ещё и передать ссылку на функцию в setTimeout (). Следующие две версии фрагмента кода эквивалентны первой:

Это может быть полезно, если у вас есть функция, которую нужно вызывать как по таймауту, так например и в ответ на событие. Но это также может помочь поддерживать ваш код в чистоте, особенно если колбэк тайм-аута занимает больше, чем несколько строк кода.

setTimeout () возвращает значение идентификатора, которое можно использовать для ссылки на тайм-аут позже, например, когда вы хотите его остановить.

Передача параметров в функцию setTimeout ()

Любые параметры, которые вы хотите передать функции, выполняемой внутри setTimeout (), должны быть переданы ей как дополнительные параметры в конце списка.

Например, вы можете реорганизовать предыдущую функцию, чтобы она передавала привет любому имени, переданному ей:

Теперь вы можете передать имя в вызов setTimeout () в качестве третьего параметра:

Очистка таймаутов

Наконец, если был создан тайм-аут, вы можете отменить его до истечения указанного времени, вызвав clearTimeout() , передав ему идентификатор вызова setTimeout() в качестве параметра. Итак, чтобы отменить указанный выше тайм-аут, вы должны сделать следующее:

Note: См. greeter-app.html для более полной демонстрации, которая позволяет вам указать имя для приветствия и отменить приветствие с помощью отдельной кнопки (см. исходный код).

setInterval()

setTimeout () отлично работает, когда вам нужно один раз запустить код по истечении заданного периода времени. Но что происходит, когда вам нужно запускать код снова и снова - например, в случае анимации?

Здесь пригодится setInterval() . Работает очень похоже на setTimeout (), за исключением того, что функция, которую вы передаёте в качестве первого параметра, выполняется повторно не менее чем за количество миллисекунд, заданных вторым параметром. Вы также можете передать любые параметры, необходимые для выполняемой функции, в качестве последующих параметров вызова setInterval ().

Давайте посмотрим на пример. Следующая функция создаёт новый объект Date() , с помощью toLocaleTimeString() извлекает из него строку с временем и отображает её в пользовательском интерфейсе. Затем он запускает функцию один раз в секунду с помощью setInterval() , создавая эффект цифровых часов, которые обновляются раз в секунду ( реальный пример, и исходный код):

Как и setTimeout () , setInterval () возвращает определённое значение, которое вы можете использовать позже, когда вам нужно очистить интервал.

Очистка интервала

setInterval () выполняет задачу постоянно. setInterval () продолжает выполнять задачу вечно, если вы что-то с ней не сделаете. Возможно, вам понадобится способ остановить такие задачи, иначе вы можете получить ошибки, если браузер не сможет выполнить какие-либо другие версии задачи или если анимация, обрабатываемая задачей, завершилась. Вы можете сделать это так же, как останавливаете timeouts - передавая идентификатор, возвращаемый вызовом setInterval () , в функцию clearInterval () :

Активное обучение: Создание собственного секундомера!

Учитывая все вышесказанное, у нас есть для вас задача. Возьмите копию нашего примера setInterval-clock.html , и измените её так, чтобы создать свой собственный простой секундомер.

Вам нужно отображать время, как и раньше, но в этом примере вам нужно:

  • Кнопка "Start" для запуска секундомера.
  • Кнопка "Stop" для паузы/остановки.
  • Кнопка "Reset", чтобы сбросить счётчик времени на 0 .
  • Дисплей времени, чтобы отображать количество прошедших секунд а не фактическое время.

Несколько подсказок для вас:

  • Вы можете структурировать и стилизовать разметку кнопок по своему усмотрению; просто убедитесь, что вы используете семантический HTML с кавычками, которые позволяют захватывать ссылки на кнопки с помощью JavaScript.
  • Вероятно, вы захотите создать переменную, которая начинается с 0, а затем увеличивается на единицу каждую секунду с использованием постоянного цикла.
  • Этот пример проще создать без использования объекта Date (), как мы это делали в нашей версии, но он будет менее точен - вы не можете гарантировать, что колбэк сработает ровно через 1000 мс. Более точным способом было бы запустить startTime = Date.now (), чтобы получить метку времени, когда пользователь нажал кнопку запуска, а затем выполнить Date.now () - startTime, чтобы получить количество миллисекунд после того, как была нажата кнопка запуска .
  • Вам также нужно рассчитать количество часов, минут и секунд как отдельные значения, а затем отображать их вместе в строке после каждой итерации цикла. На втором счётчике вы можете отработать каждую из них.
  • Как вы могли бы их рассчитать? Подумайте об этом:
    • В одном часе 3600 секунд.
    • Количество минут - это количество секунд, оставшееся после вычитания всех часов, разделённое на 60.
    • Количество секунд будет количеством секунд, оставшихся после вычитания всех минут.

    Note: Если вы застряли, вы можете увидеть нашу версию (см. также исходный код ).

    Что нужно помнить о setTimeout () и setInterval ()

    При работе с setTimeout () и setInterval () следует помнить о нескольких вещах. Давайте рассмотрим их.

    Рекурсивные таймауты

    Есть ещё один способ использования setTimeout () : вы можете вызвать его рекурсивно для повторного запуска одного и того же кода вместо использования setInterval () .

    В приведённом ниже примере используется рекурсивный setTimeout () для запуска переданной функции каждые 100 миллисекунд:

    Сравните приведённый выше пример со следующим - здесь используется setInterval () для достижения того же эффекта:

    Чем рекурсивный setTimeout () отличается от setInterval () ?

    Разница между двумя версиями приведённого выше кода невелика.

    • Рекурсивный setTimeout () гарантирует такую же задержку между выполнениями. (Например, 100 мс в приведённом выше случае.) Код будет запущен, затем подождёт 100 миллисекунд, прежде чем запустится снова, поэтому интервал будет одинаковым, независимо от того, сколько времени требуется для выполнения кода.
    • Пример с использованием setInterval () работает несколько иначе. Выбранный вами интервал включает время, затрачиваемое на выполнение кода, который вы хотите запустить. Предположим, что выполнение кода занимает 40 миллисекунд - тогда интервал составляет всего 60 миллисекунд.
    • При рекурсивном использовании setTimeout () каждая итерация может вычислять различную задержку перед запуском следующей итерации. Другими словами, значение второго параметра может указывать другое время в миллисекундах для ожидания перед повторным запуском кода.

    Когда ваш код потенциально может занять больше времени, чем назначенный вами интервал времени, лучше использовать рекурсивный setTimeout () - это сохранит постоянный временной интервал между выполнениями независимо от того, сколько времени потребуется для выполнения кода, и вы избежите ошибок.

    Немедленные таймауты

    Использование 0 в качестве значения для setTimeout () позволяет планировать выполнение указанной колбэк-функции как можно скорее, но только после того, как будет запущен основной поток кода.

    Например, код приведённый ниже (рабочий код) выводит alert содержащий "Hello" , затем alert содержащий "World" как только вы нажмёте ОК в первом alert.

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

    Очистка с помощью clearTimeout() или clearInterval()

    clearTimeout () и clearInterval () используют один и тот же список записей для очистки. Интересно, что это означает, что вы можете использовать любой метод для очистки setTimeout () или setInterval ().

    Для согласованности следует использовать clearTimeout () для очистки записей setTimeout () и clearInterval () для очистки записей setInterval () . Это поможет избежать путаницы.

    requestAnimationFrame()

    requestAnimationFrame() это специализированная функция цикла, созданная для эффективного запуска анимации в браузере. По сути, это современная версия setInterval () - она выполняет указанный блок кода до того, как браузер перерисовывает изображение, позволяя запускать анимацию с подходящей частотой кадров независимо от среды, в которой она выполняется.

    Он был создан в ответ на проблемы с setInterval () , который, например, не работает с частотой кадров, оптимизированной для устройства, иногда пропускает кадры, продолжает работать, даже если вкладка не является активной вкладкой или анимация прокручивается со страницы и т. д.(Читай об этом больше в CreativeJS.)

    Note: вы можете найти примеры использования requestAnimationFrame() в этом курсе — например в Рисование графики, and Практика построения объектов.

    Метод принимает в качестве аргумента колбэк, который должен быть вызван перед перерисовкой. Это общий шаблон, в котором он используется:

    Идея состоит в том, чтобы определить функцию, в которой ваша анимация обновляется (например, ваши спрайты перемещаются, счёт обновляется, данные обновляются или что-то ещё). Затем вы вызываете его, чтобы начать процесс. В конце функционального блока вы вызываете requestAnimationFrame () со ссылкой на функцию, переданной в качестве параметра, и это даёт браузеру указание вызвать функцию снова при следующей перерисовке дисплея. Затем он выполняется непрерывно, поскольку код рекурсивно вызывает requestAnimationFrame ().

    Note: Если вы хотите выполнить простое постоянное анимирование DOM , CSS Анимация вероятно будет быстрее. Она вычисляется непосредственно внутренним кодом браузера, а не JavaScript.

    Однако, если вы делаете что-то более сложное, включающее объекты, которые не доступны напрямую в the DOM (такие как 2D Canvas API или WebGL ), requestAnimationFrame() предпочтительный вариант в большинстве случаев.

    Как быстро работает ваша анимация?

    Плавность анимации напрямую зависит от частоты кадров анимации и измеряется в кадрах в секунду (fps). Чем выше это число, тем плавное будет выглядеть ваша анимация до точки.

    Поскольку большинство экранов имеют частоту обновления 60 Гц, максимальная частота кадров, к которой вы можете стремиться, составляет 60 кадров в секунду (FPS) при работе с веб-браузерами. Однако большее количество кадров означает больше обработки, которая часто может вызывать заикание и пропуски, также известные как пропадание кадров или заедание.

    Если у вас есть монитор с частотой обновления 60 Гц и вы хотите достичь 60 кадров в секунду, у вас есть около 16,7 миллисекунд (1000/60) для выполнения кода анимации для рендеринга каждого кадра. Это напоминание о том, что вам нужно помнить об объёме кода, который вы пытаетесь запустить во время каждого прохождения цикла анимации.

    requestAnimationFrame () всегда пытается приблизиться к этому волшебному значению 60 FPS, насколько это возможно. Иногда это невозможно - если у вас действительно сложная анимация и вы запускаете её на медленном компьютере, частота кадров будет меньше. Во всех случаях requestAnimationFrame () всегда будет делать все возможное с тем, что у него есть.

    Чем отличается requestAnimationFrame() от setInterval() and setTimeout()?

    Давайте поговорим ещё немного о том, чем метод requestAnimationFrame () отличается от других методов, используемых ранее. Глядя на наш код сверху:

    Такой же код с использованием setInterval() :

    Как мы уже говорили ранее, вы не указываете временной интервал для requestAnimationFrame () . Просто он работает максимально быстро и плавно в текущих условиях. Браузер также не тратит время на запуск, если по какой-то причине анимация выходит за пределы экрана и т. д.

    setInterval () , с другой стороны, требует указания интервала. Мы пришли к нашему окончательному значению 17 по формуле 1000 миллисекунд / 60 Гц, а затем округлили его в большую сторону. Округление - хорошая идея; если вы округлите в меньшую сторону, браузер может попытаться запустить анимацию со скоростью, превышающей 60 кадров в секунду, и в любом случае это не повлияет на плавность анимации. Как мы уже говорили, стандартная частота обновления - 60 Гц.

    В том числе временная метка

    Фактическому колбэку, переданному в функцию requestAnimationFrame () , также может быть задан параметр: значение отметки времени, которое представляет время с момента начала работы requestAnimationFrame ().

    Это полезно, поскольку позволяет запускать вещи в определённое время и в постоянном темпе, независимо от того, насколько быстрым или медленным может быть ваше устройство. Общий шаблон, который вы бы использовали, выглядит примерно так:

    Поддержка браузерами

    requestAnimationFrame () поддерживается в более поздних версиях браузеров, чем s etInterval () / setTimeout () . Интересно, что он доступен в Internet Explorer 10 и выше.

    Итак, если вам не требуется поддержка старых версий IE, нет особых причин не использовать requestAnimationFrame() .

    Простой пример

    Хватит теории! Давайте выполним упражнение с использованием requestAnimationFrame() . Создадим простую анимацию "spinner animation"—вы могли её видеть в приложениях когда происходят задержки при ответе с сервера и т.п..

    Note: Для такой простой анимации, вам следовало бы использовать CSS . Однако такой вид анимации очень полезен для демонстрации requestAnimationFrame() , вы скорее всего будете использовать этот метод когда делаете что-то более сложное, например обновление отображения игры в каждом кадре.

    Возьмите базовый HTML шаблон (такой как этот).

    элемент внутри элемента , затем добавьте внутрь символ ↻ . Этот символ будет действовать как spinner в нашем примере.

    Примените следующий CSS к HTML шаблону (любым предпочитаемым способом). Он установ красный фон на странице, высоту равную 100% высоты , и центрирует

    Как всегда напоминаю, что полный обучающий курс по JavaScript можно найти здесь:

    В программировании, как и в жизни, очень часто необходимо сделать так, чтобы какое-то событие произошло не сейчас, а в будущем, желательно в заданное время. То есть часто возникает потребность подготовить действие, но выполнить его в будущем, а не прямо сейчас.

    Простейший пример - будильник. Вы задаёте для него необходимые настройки, и он звенит в указанное вами время.

    Практически во всех средствах разработки программ имеются механизмы, позволяющие запланировать и выполнить часть исходного кода в заданное время (или через заданное время). Эти механизмы обычно называются таймерами.

    Ядро языка JavaScript не предоставляет такой возможности, но в клиентском языке JavaScript такая возможность предусмотрена в виде глобальных функций setTimeout(), clearTimeout(), setInterval() и clearInterval() . Эти функции являются глобальными методами объекта Window.

    Метод setTimeout() позволяет выполнить запуск функции через заданное число миллисекунд. Этот метод возвращает значение, которое может быть передано методу clearTimeout() для отмены запланированного ранее запуска функции.

    Метод setInterval() делает то же самое, что и метод setTimeout() . Но кроме того, он автоматически заново планирует повторное выполнение функции. Метод setInterval() также возвращает значение, которое может быть передано методу clearInterval() .

    В методы setTimeout() и setInterval() желательно передавать функцию, но допускается также передавать строку кода на JavaScript. В этом случае будет выполнена не функция, а переданный программный код. В старых браузерах возможность передачи функций не поддерживается. Поэтому, если вы хотите, чтобы ваши сценарии были совместимы со старыми браузерами, надо передавать в методы именно строку кода, а не функцию.

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

    Есть некоторые особенности использования таймеров. Даже если установить задержку 0 миллисекунд, таймер может сработать не сразу. Потому что запуск функции будет выполнен только после того, как будут обработаны все события, ожидающие очереди.

    Как написать таймер на JavaScript

    А теперь небольшой пример:

    Здесь мы используем функцию setTimeout() . Не забывайте, что эта функция, как и другие описанные выше, является методом объекта window, поэтому в некоторых случаях придётся явно указывать имя этого объекта перед методом. Хотя в большинстве случаев это необязательно.

    Также обратите внимание на то, что имя функции, которое передаётся через первый параметр метода setTimeout() , должно быть заключено в кавычки, то есть передаваться как строка. Иначе функция будет выполнена сразу - без задержки.

    Хотя вообще-то так делать не советуют - лучше передавать именно функцию. Но тогда круглые скобки после имени функции ставить нельзя (см. следующий пример).

    Здесь у нас есть простая функция TestTime() , имя которой передаётся в метод setTimeout() . Второй параметр определяет время задержки выполнения функции TestTime() . Время указывается в миллисекундах. То есть в нашем примере функция TestTime() будет выполнена через 3000 миллисекунд (через 3 секунды) после загрузки документа.

    Таким образом, мы сначала увидим надпись “Проверка работы функции setTimeout()”, а через три секунды - надпись “Функция выполнена”.

    Ещё один пример:

    Здесь мы используем метод setInterval() , который, в отличие от метода setTimeout() , выполняет код не один раз, а многократно, через указанный во втором параметре промежуток времени.

    Чтобы остановить это бесконечное выполнение, надо вызвать метод clearInterval() , в который передать идентификатор таймера. Как это делается, можно посмотреть в примере.

    Читайте также: