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

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

Мы можем вызвать функцию не в данный момент, а позже, через заданный интервал времени. Это называется «планирование вызова».

Для этого существуют два метода:

  • setTimeout позволяет вызвать функцию один раз через определённый интервал времени.
  • setInterval позволяет вызывать функцию регулярно, повторяя вызов через определённый интервал времени.

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

setTimeout

func|code Функция или строка кода для выполнения. Обычно это функция. По историческим причинам можно передать и строку кода, но это не рекомендуется. delay Задержка перед запуском в миллисекундах (1000 мс = 1 с). Значение по умолчанию – 0. arg1 , arg2 … Аргументы, передаваемые в функцию (не поддерживается в IE9-)

Например, данный код вызывает sayHi() спустя одну секунду:

Если первый аргумент является строкой, то JavaScript создаст из неё функцию.

Это также будет работать:

Но использование строк не рекомендуется. Вместо этого используйте функции. Например, так:

Начинающие разработчики иногда ошибаются, добавляя скобки () после функции:

Это не работает, потому что setTimeout ожидает ссылку на функцию. Здесь sayHi() запускает выполнение функции, и результат выполнения отправляется в setTimeout . В нашем случае результатом выполнения sayHi() является undefined (так как функция ничего не возвращает), поэтому ничего не планируется.

Отмена через clearTimeout

Вызов setTimeout возвращает «идентификатор таймера» timerId , который можно использовать для отмены дальнейшего выполнения.

Синтаксис для отмены:

В коде ниже планируем вызов функции и затем отменяем его (просто передумали). В результате ничего не происходит:

Как мы видим из вывода alert , в браузере идентификатором таймера является число. В других средах это может быть что-то ещё. Например, Node.js возвращает объект таймера с дополнительными методами.

Повторюсь, что нет единой спецификации на эти методы, поэтому такое поведение является нормальным.

Для браузеров таймеры описаны в разделе таймеров стандарта HTML5.

setInterval

Метод setInterval имеет такой же синтаксис как setTimeout :

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

Чтобы остановить дальнейшее выполнение функции, необходимо вызвать clearInterval(timerId) .

Следующий пример выводит сообщение каждые 2 секунды. Через 5 секунд вывод прекращается:

В большинстве браузеров, включая Chrome и Firefox, внутренний счётчик продолжает тикать во время показа alert/confirm/prompt .

Так что если вы запустите код выше и подождёте с закрытием alert несколько секунд, то следующий alert будет показан сразу, как только вы закроете предыдущий. Интервал времени между сообщениями alert будет короче, чем 2 секунды.

Рекурсивный setTimeout

Есть два способа запускать что-то регулярно.

Один из них setInterval . Другим является рекурсивный setTimeout . Например:

Метод setTimeout выше планирует следующий вызов прямо после окончания текущего (*) .

Рекурсивный setTimeout – более гибкий метод, чем setInterval . С его помощью последующий вызов может быть задан по-разному в зависимости от результатов предыдущего.

Например, необходимо написать сервис, который отправляет запрос для получения данных на сервер каждые 5 секунд, но если сервер перегружен, то необходимо увеличить интервал запросов до 10, 20, 40 секунд… Вот псевдокод:

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

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

Сравним два фрагмента кода. Первый использует setInterval :

Второй использует рекурсивный setTimeout :

Для setInterval внутренний планировщик будет выполнять func(i) каждые 100 мс:

Реальная задержка между вызовами func с помощью setInterval меньше, чем указано в коде!

Это нормально, потому что время, затраченное на выполнение func , использует часть заданного интервала времени.

Вполне возможно, что выполнение func будет дольше, чем мы ожидали, и займёт более 100 мс.

В данном случае движок ждёт окончания выполнения func и затем проверяет планировщик и, если время истекло, немедленно запускает его снова.

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

Ниже представлено изображение, показывающее процесс работы рекурсивного setTimeout :

Рекурсивный setTimeout гарантирует фиксированную задержку (здесь 100 мс).

Это потому, что новый вызов планируется в конце предыдущего.

Когда функция передаётся в setInterval/setTimeout , на неё создаётся внутренняя ссылка и сохраняется в планировщике. Это предотвращает попадание функции в сборщик мусора, даже если на неё нет других ссылок.

Для setInterval функция остаётся в памяти до тех пор, пока не будет вызван clearInterval .

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

setTimeout с нулевой задержкой

Особый вариант использования: setTimeout(func, 0) или просто setTimeout(func) .

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

Так вызов функции будет запланирован сразу после выполнения текущего кода.

Например, этот код выводит «Привет» и затем сразу «Мир»:

Первая строка помещает вызов в «календарь» через 0 мс. Но планировщик проверит «календарь» только после того, как текущий код завершится. Поэтому "Привет" выводится первым, а "Мир" – после него.

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

В браузере есть ограничение на то, как часто внутренние счётчики могут выполняться. В стандарте HTML5 говорится: «после пяти вложенных таймеров интервал должен составлять не менее четырёх миллисекунд.».

Читайте также:  Игра sebastien loeb rally evo

Продемонстрируем в примере ниже, что это означает. Вызов setTimeout повторно вызывает себя через 0 мс. Каждый вызов запоминает реальное время от предыдущего вызова в массиве times . Какова реальная задержка? Посмотрим:

Первый таймер запускается сразу (как и указано в спецификации), а затем задержка вступает в игру, и мы видим 9, 15, 20, 24. .

Аналогичное происходит при использовании setInterval вместо setTimeout : setInterval(f) запускает f несколько раз с нулевой задержкой, а затем с задержкой 4+ мс.

Это ограничение существует давно, многие скрипты полагаются на него, поэтому оно сохраняется по историческим причинам.

Этого ограничения нет в серверном JavaScript. Там есть и другие способы планирования асинхронных задач. Например, setImmediate для Node.js. Так что это ограничение относится только к браузерам.

Итого

  • Методы setInterval(func, delay, . args) и setTimeout(func, delay, . args) позволяют выполнять func регулярно или только один раз после задержки delay , заданной в мс.
  • Для отмены выполнения необходимо вызвать clearInterval/clearTimeout со значением, которое возвращают методы setInterval/setTimeout .
  • Вложенный вызов setTimeout является более гибкой альтернативой setInterval . Также он позволяет более точно задать интервал между выполнениями.
  • Планирование с нулевой задержкой setTimeout(func,0) или, что то же самое, setTimeout(func) используется для вызовов, которые должны быть исполнены как можно скорее, после завершения исполнения текущего кода.
  • Браузер ограничивает 4-мя мс минимальную задержку между пятью и более вложенными вызовами setTimeout , а также для setInterval , начиная с 5-го вызова.

Обратим внимание, что все методы планирования не гарантируют точную задержку.

Например, таймер в браузере может замедляться по многим причинам:

  • Перегружен процессор.
  • Вкладка браузера в фоновом режиме.
  • Работа ноутбука от аккумулятора.

Всё это может увеличивать минимальный интервал срабатывания таймера (и минимальную задержку) до 300 или даже 1000 мс в зависимости от браузера и настроек производительности ОС.

Задачи

Вывод каждую секунду

Напишите функцию printNumbers(from, to) , которая выводит число каждую секунду, начиная от from и заканчивая to .

Сделайте два варианта решения.

  1. Используя setInterval .
  2. Используя рекурсивный setTimeout .

решение

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали об объекте String в Javascript. В данной небольшой статье я бы хотел показать, как реализовать таймер на Javascript. Использовать таймеры можно для чего угодно, например, для отображения времени на сайте, а также для обратного отсчета времени окончания скидки на товар. Вообще, на многих сайтах сейчас можно встретить реализацию таймера. Запустить таймер, можно с помощью двух функций — это setInterval() , которая (как видно из названия) будет выполняться постоянно с заданным интервалом, а также функция setTimeout() , которая выполняется один раз.

Давайте реализуем часы на сайте, самые обыкновенные, без всякой графики:

Однако, если мы запустим данный скрипт, то увидим, что время начинает показываться не сразу, а через некоторое время. Для того, чтобы время выводилось при загрузке страницы можно воспользоваться таким способом:
В событие onLoad тега body поставить нашу функцию:

И ещё один момент, строку setInterval(myClock, 1000); необходимо занести в функцию myClock() , иначе время будет обновляться только при обновлении страницы, т.е. никакого таймера не будет.

P.S. события мы пока не рассматривали, но они будут рассмотрены в одной из следующих статей.

В качестве домашнего задания:

Создайте таймер обратного отсчета в 60 секунд. Если время будет меньше 20 секунд, то изменить цвет на красный. Когда время кончится (0), то вывести сообщение, что время вышло. Постарайтесь код реализовать сами. Если не получится, то можно посмотреть под хайдом:

В данной статье вы узнали, как реализовать таймер на Javascript на примере часов и таймера обратного отсчета.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.

Самый простой и удобный таймер обратного отсчета

Javascript

Указываем дату окончания работы таймера

Формат вывода даты ISO 8601:

Вывод даты с точным временем и часовым поясом:

Вывод таймера для лендингов – таймер все время будет выводить, что осталось 15 дней (можно указать любое время)

Рабочий пример Таймера обратного отсчета

Скрываем таймер после окончания времени и выводим сообщение, что время истекло

Данное решение предложил в комментариях Игорь.

Добавляем в HTML блок с сообщением

Добавляем такие стили в CSS:

В скрипте меняем функцию инициализации таймера function initializeClock(id, endtime) <. >, остальное оставляем так же, как было:

В данной функции изменилось то, что при истечении времени таймера, на сам таймер добавляется класс .hidden (скрывает таймер), а на сообщение об окончании времени вешается класс .visible (отображает сообщение), а так же прекращаем выполнение функции вызовом метода clearInterval(timeinterval); . А вывод единиц времени помещен после проверки истекло время или нет.

Рабочий пример Таймера обратного отсчета с выводом сообщения об истечении времени

Нажмите кнопку Rerun, чтобы убедиться, что все работает как надо.

Таймер обратного отсчета времени с рестартом

Суть таймера в том, что при окончании времени таймер не останавливается, не выводится никакое сообщение, а просто начинается новый отсчет:

Таймер установлен на 5 секунд и при окончании времени будет перезапущен еще на 5 секунд

Разница в JS-коде между вариантом с выводом сообщения об окончании времени только в замене этого кода

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

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

Комментарии (82) к “Простой таймер обратного отсчета на Javascript”

Артём

Я закопипастил код. В моем случае надо отсчитывать от 35 до 0 секунд. Таймер считает от 35 до 19 сек, а потом начинает считать в обратном порядке, от 19 до 60

Читайте также:  Stm объектив что это

Denis Creative

Никита

А как задать текущее время? Чтоб отсчет таймера шел от реально времени

Denis Creative

Это таймер обратного отсчета. Что вы имеете в виду под “Чтоб отсчет таймера шел от реально времени”?

Никита

Чтобы отсчет шел от времени которое на данный момент и до конечной даты

Denis Creative

По такому примеру таймер будет отсчитывать время до 20 мая

Александр

Подскажите как скрыть таймер когда время вышло?

Игорь

Denis Creative

Спасибо. Добавил код в статью.

Игорь

Это вам спасибо уже 3 заказ на фрилансе на основе этого кода )))

Николай

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

Denis Creative

Таймер должен быть задан в таком случае на конкретную дату:
var deadline="January 01 2019 00:00:00 GMT+0300";
а не на текущее время + время таймера:
var deadline = new Date(Date.parse(new Date()) + 35 * 1000);

Денис

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

Denis Creative

Приведите пример, что нужно. Потому как в статье описаны 2 варианта, которые требуются в 99% использования таймеров.

Денис

Зациклить таймер можно ?

Денис

Так я же написал, что бы по окончанию счета он начал заново считать, а в примерах он заканчивает считать и показывается блок time the up

Denis Creative

В примере с выводом сообщения об окончании времени нужно изменить код

заменить на этот:

Рабочий пример добавил в статью

Денис

Здравствуйте, а если такая задача: считать до определённого времени от текущая дата + N дней?

Denis Creative

От текущей даты до + N дней такой код используется:

15 – дни
24 – часы
60 – минуты

Александр

Denis Creative, здравствуйте!
Спасибо Вам за эту статью, она почти мне помогла.
Хотелось бы узнать, если ли возможность чтобы счетчик сбрасывался на сайте каждые два дня Допустим я его выгружаю в 0:00 и он стартует на два дня и потом снова сбрасывается на два дня.
Как я понял ваш вариант он запускается автоматически при загрузке старицы и другой каждый раз надо менять дату в коде.

Denis Creative

Нужно взять код таймера обратного отсчета времени с рестартом и поменять
1. Конечную дату

2. Обновление конечной даты после истечения срока действия таймера

Получится примерно такой код, не знаю, на сколько правильный, но вроде работает:
https://codepen.io/deniscreative/pen/BGEqdM

Виталий

Денис. А можете еще подсказать как сделать чтобы таймет продолжал считать в обратном направлении и при этом класс добавлялся к цифрам?
То-есть задача сделать что-то з 10 минут, таймер для тернировки. Если в 10 минут не укоадываются то красным идет обратный отсчет на сколько превысили время?

Denis Creative

Мне кажется, этот таймер не совсем подходит под Вашу задачу.

Здравствуйте, подскажите пожалуйста как сделать чтобы отсчёт шел допустим 2012 года 1 января допустим и до бесконечности? посмотрел в data-countdown на гите , там у них есть пример, но как реализовать так и не понял..
Спасибо.

Denis Creative

Не понял вопрос, как это до бесконечности?
Таймер обратного отсчета предполагает, что есть конечная дата, и ведет отсчет до нее.
Подсчет времени от какой-то даты до текущего момента, это простой таймер. Вам нужен просто таймер? Для этого нужен другой код.

Подскажите, а как в скрипте указать отображение русского языка. У меня ����������� отображается когда меняю на русский текст

Denis Creative

Стоит в шапке, все как надо. Причем вокруг текст на странице русский, нормально отображается, а вот именно текст скрипта ������������ ��������

Denis Creative

Чет не пойму, какой текст скрипта? Если скрипт только цифры выводит…

Dvtcnj Countdown Clock русская фраза, и вместо Hours и пр. Руский шрифт коверкается.

Denis Creative

Эти фразы не в скрипте, а в HTML используются.
Проверьте кодировку файла, чтобы там было UTF-8 без BOM.

санек

как сделать чтобы он не запускался сам?

Denis Creative

а как он должен запускаться?

санек

Denis Creative

это вам нужен обычный таймер, наверное

Владимир

Добрый день. А как сделать чтобы счетчик времени начинался с 02 часов 35 мин 25 сек?

Владимир

точнее таймер с обратным отчетов начинался 02:35:24

Denis Creative

2*60*60 + 35*60 + 24 = 9324 секунды

Нурбек

у меня ничего не выводит –

Может устарела библиотека?

Denis Creative

Тут нечему устаревать – проверьте свой HTML

Анастасия

А как сделать что бы таймер который по окончанию времени начинает отсчет заново (последний вариант) не скидывал время при обновлении страницы?
Т.е. мне надо чтоб он отсчитывал допусти 24 часа с 00:00:00 и в полночь отсчет опять обнулялся бы. А то сейчас получается что если ставить 12 часов отсчета при обновлении страницы опять 12 часов, а не 11:58

Denis Creative

Анастасия

Спасибо. Сначала почему то не получилось, но теперь все работает!

Denis Creative

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

Максим

Здравствуйте! Стоит такая задача. Таймер обратного отсчета, но что бы он отсчитывал до 15 числа каждого месяца до 19.00. Потом перезапускался и снова отсчитывал до 15 числа 19.00 следующего месяца. И так постоянно. Просто если поставить 30 дней а в месяце будет 31 то получиться что таймер не правильно будет считать

Читайте также:  Как отвязать номер от стр в вк

Denis Creative

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

Андрей

Здравствуйте! А как сделать так, что бы текущему времени добавить еще несколько секунд? Когда добавляю по кнопке запуск функции initializeClock(‘clockdiv’, deadline); – то считает уже два времени одновременно. Как остановить(убрать) первый отсчет времени? или обновить его

Denis Creative

Создайте пример на Codepen – будет понятнее, что вы имеете в виду.

Михайл

Спасибо! То что нужно ) Искал, но попадалось всякое. Мне нужна была фишка с указыванием GMT+0300 а то для разных стран показывалось разные значения )

Денис, здравствуйте. Смотрите, у меня два счётчика на сайте, что мне сделать, чтобы второй счётчик не слетел? Пожалуйста помогите

Denis Creative

Задать им разные id .

При этом весь скрипт копировать не нужно, просто инициализировать второй таймер отдельно initializeClock(‘countdown-2’, deadline);

Спасибо вам большое, Денис. Пост 17 года, а вы до сих пор помогаете другим. А таймер вообще очень хороший 🙂

Denis Creative

Рад, что информация на сайте полезна для кого-то)

Павел

Здравствуйте! Подскажите пожалуйста, нужен циклический таймер, на 15 дней, но чтобы при перезагрузке страницы время таймера не сбрасывалось. Возможно такое реализовать?

Denis Creative

Можно, если использовать куки.

Василий

Добрый день. Очень классный таймер. А подскажите, пожалуйста, как изменить функцию, чтобы если больше месяца, указывал месяцы и количество дней. я добавил в return getTimeRemaining months, в updateClock дописал if (t.months > 0) <
t.days = t.days – (30 * t.months);
>. Как Вы понимаете, все работает, но не учитывается количество дней в месяце, а всегда по умолчанию считает 30. нужно чуть допилить, но не знаю в какую сторону смотреть.
мой код https://codepen.io/vasylbakanovskyi/pen/eYOzEZZ

Алексей

Было бы круто если дописать вывод слов (дни, часы, минуты, секунды) на js и проверять текущее значение времени и выводить корректное слово например 43 минуты или 25 минут. Думаю посыл понятен.

Denis Creative

Тогда это уже не будет “Простой таймер обратного отсчета на Javascript”.

Соломон

Здравствуйте ! Спасибо за таймер. Подскажите , пожалуйста, как изменить код , чтоб число дней могло быть трёхзначным .
Спасибо.

Denis Creative

А в чем проблема?

Выводится трехзначное число

Соломон

Уважаемый Денис ! Большое спасибо за ответ . Дело в том , что я новичок (хотя мне больше 70).
Я много времени изучал код Вашего таймера , скопировал , что-то добавлял , но так и не получил результата .Читая комментарии . понял , что для обращения к Вам , полезно использовать codepen.io .Очень прошу , если найдёте время , найдите ошибку в моём коде
https://codepen.io/solomon-shmulevich/pen/dybdGdV . Заранее благодарю.

Denis Creative

Добрый день, подчистив немного Ваш код и заменив переменную deadline :
var deadline="January 01 2022 00:00:00 GMT+0300";
получаем вполне рабочий вариант с трехзначным форматом для дней.
В Codepen во вкладке HTML нужно добавлять только код HTML внутри тега , во вкладке CSS нужно следить за правильным открытием и закрытием скобок, а во вкладке JS не должно быть ничего лишнего кроме кода Javascript.

Соломон

Уважаемый Денис! Огромное спасибо! Желаю Вам здоровья и успехов!

Denis Creative

Олександр

Здравствуйте а как сделать так чтобы скрипт отсчитывал от введенной даты 7 дней и писал осталось
например ведена дата 2019-10-1 , отсчитывал этой даты 7 дней и выводил оставшихся дней, часов,… до читал до ноля после останавливался

Denis Creative

Просто немного изменить скрипт, или заказать нужный скрипт на фрилансе.

Олександр

вопрос как изменить)))

Олександр

или боле точнее вы может его так изменить? сам наверное не допру((((

Denis Creative

Извиняюсь, нет времени разбираться, может кто-то здесь ответит, но лучше обратиться на фриланс.

Олександр

понятно печально, спасибо за помощь врядли тут кто-та поможет, а можно взять ваш код и обратиться за помощью на другие ресурсы??

Denis Creative

Да, конечно, успехов!

Алиса

А как остановить таймер, когда время закончится (будет значение во фронте 0:0:0:0, чтобы в минус не уходило)?

Сергей

Алиса, там же есть вверху пример номер 2, “Таймера обратного отсчета с выводом сообщения об истечении времени”, выводите что-то типа “ВремяИстекло!”

Сергей

Спасибо! Отлично! Встроил его в компонент в битриксе. Крутое и простое в реализации решение!

Розалия

Здравствуйте.
Встроила таймер на свой сайт, чтобы каждый день с 00:00 отчитывало заново. При переходе на следующий день в блоке “день” при новой загрузке страницы каждый раз на 2-3секунды выходит значение -1, потом всё исправляется и показывает правильно 0. При этом часы, минуты, секунды считает правильно.
Что надо исправить? подскажите, пожалуйста

Denis Creative

Не знаю, на сколько получилось правильно, но вот пример – https://codepen.io/deniscreative/pen/xxbORRP

Нужно поменять функцию updateClock()

Розалия

Спасибо большое! Всё работает правильно.

viktor

всё отлично работает.Скрипт вставил себе на сайт, и просто повставлял себе в код ID и class, и все отлично заработало. Спасибо.

Dennis

Денис, спасибо вам за данный таймер, но есть проблема его отображения в Firefox, вместо отсчета выводится выводится nAn, все остальное aN. Я пробовал вывести в консоль переменную t она выводит NaN . Как это исправить?

Denis Creative

Проверьте все классы и их правильное использование в javascript-коде. Данный таймер работает во всех браузерах.

Dennis

Вопрос решил! Была проблема с форматом даты, вместо “March 15 2020 00:00:00 GMT+0300” я указал ‘Sun, 15 Mar 2020 00:00:00 GMT’ и таймер заработал

Ссылка на основную публикацию
Как сделать прямую палку на клавиатуре
Косая черта – это знак, который можно набрать на клавиатуре компьютера. Он используется в интернете, в системе Windows, программировании, математике...
Как связаться с инстаграм по телефону
В этой статье расскажем о том, как работает горячая линия линия Инстаграмм, можно ли обратиться по телефону или доступен только...
Как связаться с инстаграмом
В этой статье расскажем о том, как работает горячая линия линия Инстаграмм, можно ли обратиться по телефону или доступен только...
Как сделать публичный pgp ключ
Использование PGP/GPG, руководство для нетерпеливых Данная статья представляет собой краткое руководство по использованию GnuPG (он же GPG). В ней вы...
Adblock detector