向数字时钟添加闹铃

上周我们创建了一个用jQuery和CSS3制作的数字时钟 ,在本次更新中,我们将使用HTML5的audio元素来添加对闹铃设置的支持。

DEMODOWNLOAD

思路

为了扩展数字时钟对闹铃的支持,我们需要在上周的代码中添加一些关键的部分方法:

  • 我们需要一种方法来让人们设置和调整闹铃,这将需要一些带设置闹铃时间设置区域之类的对话框;
  • 每一秒,我们需要检查闹铃是否应该响铃,如果是,我们就播放一小段音频文件并且提示“时间到”的对话框。
    这些特性要修改HTML,CSS和jQuery,让我们开始!

Setting an Alarm

HTML

我们有两个对话框 - 一个是用来设置/编辑闹铃的,而另一个是来显示闹铃时间已到的。

index.html

<div class=”overlay”>

&lt;div id="alarm-dialog"&gt;

    &lt;h2&gt;Set alarm after&lt;/h2&gt;

    &lt;label class="hours"&gt;
        Hours
        &lt;input type="number" value="0" min="0" /&gt;
    &lt;/label&gt;

    &lt;label class="minutes"&gt;
        Minutes
        &lt;input type="number" value="0" min="0" /&gt;
    &lt;/label&gt;

    &lt;label class="seconds"&gt;
        Seconds
        &lt;input type="number" value="0" min="0" /&gt;
    &lt;/label&gt;

    &lt;div class="button-holder"&gt;
        &lt;a id="alarm-set" class="button blue"&gt;Set&lt;/a&gt;
        &lt;a id="alarm-clear" class="button red"&gt;Clear&lt;/a&gt;
    &lt;/div&gt;

    &lt;a class="close"&gt;&lt;/a&gt;

&lt;/div&gt;

</div>

<div class=”overlay”>

&lt;div id="time-is-up"&gt;

    &lt;h2&gt;Time's up!&lt;/h2&gt;

    &lt;div class="button-holder"&gt;
        &lt;a class="button blue"&gt;Close&lt;/a&gt;
    &lt;/div&gt;

&lt;/div&gt;

</div>
这两个对话框都是用CSS隐藏的,当需要显示时用jQuery的fadeIn()方法来显示。另一个值得指出的是闹铃对话框使用HTML5的带 min 值为0的 number 输入框,数字输入框是非常容易用JavaScript来验证的并且在移动设置上也会调出数字键盘。

接下来是HTML5的 audio 元素,它带有两个不同的音频格式,第一个是mp3版本的警报声音,第二个是ogg格式,ogg格式仅在因许可证问题而还不支持mp3播放的Firefox下才需要。还好几乎所有其他支持HTML5音频的浏览器也支持mp3。

index.html

<audio id=”alarm-ring” preload>
<source src=”assets/audio/ticktac.mp3” type=”audio/mpeg” />
<source src=”assets/audio/ticktac.ogg” type=”audio/ogg” />
</audio>

preload 属性告知浏览器这些声音文件是需要提前下载的,一旦我们决定播放它们时需要它们立即生效(否则在一个警报声音首次播放时会有延时直到它们下载下来)。播放声音文件极为简单,这要感谢JavaScript的HTML5 audio API (下一节中会有更多介绍)。

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();

// This will hold the number of seconds left
// until the alarm should go off
var alarm_counter = -1;
接下来,我们要在update_time()方法中检查每秒是否存在未处理的闹铃。

// Is there an alarm set?

if(alarm_counter > 0){

// Decrement the counter with one second
alarm_counter--;

// Activate the alarm icon
alarm.addClass('active');

}
else if(alarm_counter == 0){

time_is_up.fadeIn();

// Play the alarm sound. This will fail
// in browsers which don't support HTML5 audio

try{
    $('#alarm-ring')[0].play();
}
catch(e){}

alarm_counter--;
alarm.removeClass('active');

}
else{
// The alarm has been cleared
alarm.removeClass(‘active’);
}
当计数器到达0时,这意味着我们将播放闹铃声音并显示“时间到”的对话框。我用jQuery选择了 #alarm-ring 声音元素,并访问集合中的第一个DOM元素以用于调用在声音元素上可用的JavaScript的 play()方法

TIme

TIme’s up!

最后剩下要做的,是要处理“设置闹铃”的对话框和不同的的按钮:

// Handle setting and clearing alamrs

$(‘.alarm-button’).click(function(){

// Show the dialog
dialog.trigger('show');

});

dialog.find(‘.close’).click(function(){
dialog.trigger(‘hide’)
});

dialog.click(function(e){

// When the overlay is clicked, 
// hide the dialog.

if($(e.target).is('.overlay')){
    // This check is need to prevent
    // bubbled up events from hiding the dialog
    dialog.trigger('hide');
}

});

alarm_set.click(function(){

var valid = true, after = 0,
    to_seconds = [3600, 60, 1];

dialog.find('input').each(function(i){

    // Using the validity property in HTML5-enabled browsers:

    if(this.validity &amp;&amp; !this.validity.valid){

        // The input field contains something other than a digit,
        // or a number less than the min value

        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 &lt; 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');

});

// Custom events to keep the code clean
dialog.on(‘hide’,function(){

dialog.fadeOut();

}).on(‘show’,function(){

// Calculate how much time is left for the alarm to go off.

var hours = 0, minutes = 0, seconds = 0, tmp = 0;

if(alarm_counter &gt; 0){

    // There is an alarm set, calculate the remaining time

    tmp = alarm_counter;

    hours = Math.floor(tmp/3600);
    tmp = tmp%3600;

    minutes = Math.floor(tmp/60);
    tmp = tmp%60;

    seconds = tmp;
}

// Update the input fields
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();
});
关于上面代码有点有意思的地方,注意我在35行是怎么使用内置 validity (在流行浏览器的一个为数字输入框存在)属性的。 它告诉我们是否输入域的内容是一个比0大的数字(记住它们的最小值为0)。

另外一件值得指出的事是闹铃对话框的代码是用自定义事件组织的,当 show 事件触发时,我们计算闹铃的剩余小时,分和秒,并填充到输入框中。

至此我们带闹种的漂亮的数字时钟就完成了! 我希望你喜欢这个快速教程并方便的用于你自己的项目。

E文链接:http://tutorialzine.com/2013/06/digital-clock-adding-alarms/