Добавляем будильник к цифровым часам на CSS3 и jQuery
В прошлом материале мы создали цифровые часы на CSS3 и jQuery. В этой дополнительной статье давайте разберемся с тем, как добавить в эти часы функцию самого настоящего будильника с помощью элемента audio в HTML5.
Концепт
Для того, чтобы расширить функционал наших часов с помощью будильника нам понадобится добавить к существующему коду несколько важных функциональных частей.
Во-первых, нам нужно дать людям возможность устанавливать время срабатывания будильника. Для реализации этого момента нам понадобится диалоговое окно с полями, где можно будет указать нужное время.
Во-вторых, нам нужно будет каждую секунду проверять, не наступило ли еще время для сигнала. Если оно наступило, то мы проиграем коротенькое аудио и покажем сообщение "Время вышло!"
Чтобы все это сделать, нам потребуется внести изменения в HTML, CSS и jQuery-код. Начнем!
HTML
У нас будет два диалоговых окна - одно для установки / редактирования времени, а второе - для показа сообщения, что время истекло.
index.html
<div class="overlay">
<div id="alarm-dialog">
<h2>Set alarm after</h2>
<label class="hours">
Hours
<input type="number" value="0" min="0" />
</label>
<label class="minutes">
Minutes
<input type="number" value="0" min="0" />
</label>
<label class="seconds">
Seconds
<input type="number" value="0" min="0" />
</label>
<div class="button-holder">
<a id="alarm-set" class="button blue">Set</a>
<a id="alarm-clear" class="button red">Clear</a>
</div>
<a class="close"></a>
</div>
</div>
<div class="overlay">
<div id="time-is-up">
<h2>Time's up!</h2>
<div class="button-holder">
<a class="button blue">Close</a>
</div>
</div>
</div>
Оба этих окна скрыты средствами CSS и показываются с помощью jQuery-метода fadeIn() в тот момент, когда это нужно.
Следующий момент, который стоит отметить - это то, что в окне для ввода времени используется поле для ввода чисел с минимальным значением равным нулю, а для числовых полей очень удобно и легко производить валидацию с помощью JavaScript (об этом чуть позже).
<audio id="alarm-ring" preload>
<source src="assets/audio/ticktac.mp3" type="audio/mpeg" />
<source src="assets/audio/ticktac.ogg" type="audio/ogg" />
</audio>
Далее - это элемент audio в HTML5. В нем есть тэги для указания адресов до двух аудиофайлов. Первый файл - это mp3-версия сигнала, второй - ogg-версия. Формат ogg нужнен только для Firefox, который не поддерживает воспроизведение mp3 из-за вопросов лицензирования.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Хорошо, что все остальные браузеры, понимающие тэг audio, также поддерживают воспроизведение mp3-файлов.
Атрибут preload дает браузеру инструкцию, что аудиофайлы должны быть загружены заранее, чтобы далее к ним можно было получить доступ мгновенно (в противном случае мы можем столкнуться с задержкой сигнала будильника при первом срабатывании).
jQuery
В этой части руководства мы расширим jQuery-код исходных часов. Я не буду объяснять весь код, который мы писали в прошлый раз, а отмечу только то, что добавилось.
Первое, что мы сделаем - это определим ряд переменных, необходимых для функционирования будильника.
assets/js/script.js
var dialog = $('#alarm-dialog').parent(),
alarm_set = $('#alarm-set'),
alarm_clear = $('#alarm-clear'),
time_is_up = $('#time-is-up').parent();
// Здесь содержится число секунд
// до срабатывания будильника
var alarm_counter = -1;
Затем, на каждом тике функции update_time() нам нужно проверять, нет ли у нас ожидающего исполнения сигнала будильника.
// Есть ли установленный будильник?
if(alarm_counter > 0){
// Уменьшаем значение счетчика на 1 секунду
alarm_counter--;
// Активируем иконку будильника
alarm.addClass('active');
}
else if(alarm_counter == 0){
time_is_up.fadeIn();
// Проиграть звук будильника (номер не пройдет
// в браузерах не поддерживающих аудио HTML5)
try{
$('#alarm-ring')[0].play();
}
catch(e){}
alarm_counter--;
alarm.removeClass('active');
}
else{
// "Сброс" будильника
alarm.removeClass('active');
}
Когда счетчик достигает значения "0", это означает, что нам нужно проиграть звук и показать окно "Время вышло!".
Обратите внимание, что хотя я выбираю с помощью jQuery элемент #alarm-ring, я получаю доступ к первому DOM-элементу в наборе, обращаясь таким образом к JavaScript-методу play(), который доступен для элементов типа audio.
Последний момент, который нужно реализовать - это обработка окна с установкой будильника и различные кнопки:
// Обработка установки и удаления будильника
$('.alarm-button').click(function(){
// Показ окна
dialog.trigger('show');
});
dialog.find('.close').click(function(){
dialog.trigger('hide')
});
dialog.click(function(e){
// Прячем окно по клику
if($(e.target).is('.overlay')){
dialog.trigger('hide');
}
});
alarm_set.click(function(){
var valid = true, after = 0,
to_seconds = [3600, 60, 1];
dialog.find('input').each(function(i){
// Используем свойство validity в браузерах с поддержкой HTML5
if(this.validity && !this.validity.valid){
// Поле содержит что-то отличное от числа
// или число меньше минимально возможного значения
valid = false;
this.focus();
return false;
}
after += to_seconds[i] * parseInt(parseInt(this.value));
});
if(!valid){
alert('Please enter a valid number!');
return;
}
if(after < 1){
alert('Please choose a time in the future!');
return;
}
alarm_counter = after;
dialog.trigger('hide');
});
alarm_clear.click(function(){
alarm_counter = -1;
dialog.trigger('hide');
});
// Пользовательские события
dialog.on('hide',function(){
dialog.fadeOut();
}).on('show',function(){
// Подсчитываем, как много времени осталось до срабатывания будильника.
var hours = 0, minutes = 0, seconds = 0, tmp = 0;
if(alarm_counter > 0){
// Будильник установлен, считаем оставшееся время
tmp = alarm_counter;
hours = Math.floor(tmp/3600);
tmp = tmp%3600;
minutes = Math.floor(tmp/60);
tmp = tmp%60;
seconds = tmp;
}
// Обновляем поля input
dialog.find('input').eq(0).val(hours).end().eq(1).val(minutes).end().eq(2).val(seconds);
dialog.fadeIn();
});
time_is_up.click(function(){
time_is_up.fadeOut();
В этом коде есть еще пара нтересных моментов. Обратите внимание на то, как я использую встроенное свойство валидации, которое существует для полей input с типом number в современных браузерах. Оно призвано проверять, чтобы введенное значение было числом больше нуля.
Еще один момент: когда отрабатывает событие show, мы подсчитываем оставшиеся часы, минуты и секунды до сигнала, которые затем подставляются в поля input.
На этом доработку наших часов можно считать законченной! Надеюсь, что вам понравилось это руководство и вы найдете, где применить показанный пример на практике.
По материалам tutorialzine.com
Перевод: Дмитрий
P.S. Хотите круто программировать и не только? Присмотритесь к премиум-урокам по различным аспектам сайтостроения, включая JavaScript, jQuery и Ajax, а также к бесплатному курсу по созданию своей CMS-системы на PHP с нуля:
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также:
|
PHP: Получение информации об объекте или классе, методах, свойствах и наследовании Сервис онлайн-записи на собственном Telegram-боте
Попробуйте сервис онлайн-записи VisitTime на основе вашего собственного Telegram-бота:— Разгрузит мастера, специалиста или компанию; — Позволит гибко управлять расписанием и загрузкой; — Разошлет оповещения о новых услугах или акциях; — Позволит принять оплату на карту/кошелек/счет; — Позволит записываться на групповые и персональные посещения; — Поможет получить от клиента отзывы о визите к вам; — Включает в себя сервис чаевых. Для новых пользователей первый месяц бесплатно. Зарегистрироваться в сервисе |
|
|
Функции обратного вызова, анонимные функции и механизм замыканий |
|
|
Деструктор и копирование объектов с помощью метода __clone() |
|
|
Эволюция веб-разработчика или Почему фреймворк - это хорошо? |
|
|
Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.) |
|
|
50 классных сервисов, программ и сайтов для веб-разработчиков |



















