编程示例:web页面上的定时器

该文章介绍如何在web页面上创建一个定时器工具,用户可设置小时、分钟和秒数,点击开始后,当达到设定时间会触发音乐提醒。代码基于JavaScript,利用AudioContext和WebAudioAPI来播放提醒音乐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程示例:web页面上的定时器

在windows10没有找到定时器这个小工具,因为经常在手机上使用这个小工具
也是很好用的小工具。 于是,在web页面上,实现了这个小工具。

操作步骤:
第一步:设置到期的小时数,分钟数,和秒数。
第二步:点击开始按钮,激活定时器。
第三步:当到达设定时间时,系统响起音乐,提醒用户时间已到。

代码如下:
<html>
<head>
<title>定时器</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="thread.js"></script>    
<style type="text/css">
<!--
body,tr,td { font-size: 12px;}
-->
</style>
</head>
<body>
<script>
window.AudioContext = window.AudioContext || window.webkitAudioContext;

if (!window.AudioContext)
    { 
        alert('当前浏览器不支持Web Audio API');
    }
var arrFrequency = [196.00, 220.00, 246.94, 261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25, 587.33, 659.25, 698.46, 783.99, 880.00, 987.77, 1046.50];

var thread_arr=[];
var timer_count=0;
var second_count=0;

var func=function(_o)
{
    document.getElementById(_o).innerHTML=num_to_time(timer_count);
    //parseInt(document.getElementById(_o).innerHTML)+1;
    timer_count++;
    
    if(timer_count==second_count)
    {
       play_sound();
    }
}
function num_to_time(num)
{
   var minite=parseInt(num/60,10);
   var second=parseInt(num%60,10);
   var minite_str=''+minite;
   var second_str=''+second;
   if(minite<10) {minite_str='0'+minite;} 
   if(second<10) {second_str='0'+second;}
   return minite_str+":"+second_str;
}
function start()
{
  timer_count=0;
  if(thread_arr.length==0)
  {
  var t1=new Thread(func,1000,1021,"t1");
   thread_arr.push(t1);
   t1.start();
  }
  else 
  { thread_arr[0]=null;
    var t1=new Thread(func,1000,1021,"t1");
    thread_arr[0]=t1;
    t1.start();
  }
  
  second_count=getSecondNum();
}

function abort()
{
   if (thread_arr.length>0)
   {
     var t1=thread_arr[0];
     t1.abort();
     
   }
}
function getSecondNum()
{
   var hour=parseInt(document.getElementById("hour").value,10);   
   var minute=parseInt(document.getElementById("minute").value,10); 
   var second=parseInt(document.getElementById("second").value,10); 
   return hour*3600+minute*60+second;  
}
function sleep()
{
   var hour=parseInt(document.getElementById("hour").value,10);   
   var minute=parseInt(document.getElementById("minute").value,10); 
   var second=parseInt(document.getElementById("second").value,10); 
  alert(hour*3600+minute*60+second);   
}


function play_sound()
    {
        // 音调依次递增或者递减处理需要的参数
        var start = 0, direction = 1;
        for (var i = 0; i < 54000; i++) {

            if (i%3000==0) {
            //thead
            // 创建新的音频上下文接口
            var audioCtx = new AudioContext();
            // 当前频率
            var frequency = arrFrequency[start];
            // 如果到头,改变音调的变化规则(增减切换)
            if (!frequency) {
                direction = -1 * direction;
                start = start + 2 * direction;
                frequency = arrFrequency[start];
            }
            // 改变索引,下一次hover时候使用
            start = start + direction;
            // 创建一个OscillatorNode, 它表示一个周期性波形(振荡),基本上来说创造了一个音调
            var oscillator = audioCtx.createOscillator();
            // 创建一个GainNode,它可以控制音频的总音量
            var gainNode = audioCtx.createGain();
            // 把音量,音调和终节点进行关联
            oscillator.connect(gainNode);
            // audioCtx.destination返回AudioDestinationNode对象,表示当前audio context中所有节点的最终节点,一般表示音频渲染设备
            gainNode.connect(audioCtx.destination);
            // 指定音调的类型,其他还有square|triangle|sawtooth
            oscillator.type = 'sine';
            // 设置当前播放声音的频率,也就是最终播放声音的调调
            oscillator.frequency.value = frequency;
            // 当前时间设置音量为0
            gainNode.gain.setValueAtTime(0, audioCtx.currentTime);
            // 0.01秒后音量为1
            gainNode.gain.linearRampToValueAtTime(1, audioCtx.currentTime + 0.01);
            // 音调从当前时间开始播放
            oscillator.start(audioCtx.currentTime);
            // 1秒内声音慢慢降低,是个不错的停止声音的方法
            gainNode.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 5);
            // 1秒后完全停止声音
            oscillator.stop(audioCtx.currentTime + 1);
            }
        }
    }
</script>
<input id="hour" type=text value=0>小时:</input>
<input id='minute' type=text value=3> 分钟</input>
<input id='second' type=text value=0>秒 </input>
<input type="button" value="开始" οnclick='start();'></input>
<input type="button" value="sleep1" οnclick='sleep();'></input>
<input type="button" value="resume1" οnclick='resume();'></input>
<input type="button" value="abort1" οnclick='abort();'></input>
<div id="t1">0</div>
</body>
</html>

另一个脚本文件thread.js,要放在与主页面同一个目录之下。如下:
function Thread(_task,_delay,_times)
{
    this.runFlag=false;
    this.busyFlag=false;
    this.taskArgs=Array.prototype.slice.call(arguments,3);
    
    if (_times!=undefined)
    {
        this.times=_times;
    }
    else
    {
        this.times=1;
    }
    
    var _point=this;
    
    this.timerID=-1;
    
    this.start=function()
    {
        if (this.runFlag==false)
        {
            this.timerID=window.setInterval(_point.run,_delay);            
            this.runFlag=true;
        }
    }
    
    this.run=function()
    {
        if (_point.busyFlag) return;
        if (_point.times==-1)//无限循环 
        {
            _task(_point.taskArgs);
        }
        else if (_point.times>0)
        {
            _task(_point.taskArgs);
            _point.times-=1;
            if (_point.times==0)
            {
                window.clearInterval(this.timerID);
            }                                  
        }        
    }
    
    this.sleep=function()
    {
        this.busyFlag=true;
    }
    
    this.resume=function()
    {
        this.busyFlag=false;
    }
    
    this.abort=function()
    {        
        window.clearInterval(this.timerID);        
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王伟1982

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值