js实现倒计时效果

本文提供两种方法实现倒计时的效果

  1. 获取到需要倒计时的时间毫秒数,用定时器让这个数字每一秒减1,将毫秒数显示在页面中。
  2. 通过需要倒计时的时间毫秒数,计算出当前时间加上倒计时时间的未来时间,通过定时器计算这两个的时间差,显示在页面中。
    先来看最终的效果:
    js倒计时
    页面布局代码:
<input type="text"><input type="text"><input type="text"><button id="btn">开始</button>
<div id="div0"></div>

第一种方法:

var inputs,timer,inter;
init();
function init(){
    //获取页面中的input
    inputs=document.getElementsByTagName("input");
    //获取按钮
    var btn=document.getElementById("btn");
    //给input添加正则判断,只能输入数字
    for(var i=0;i<inputs.length;i++){
        inputs[i].oninput=inputHandler;
    }
    //给按钮添加点击事件
    btn.onclick=clickHandler;
}
//input内容判断,只能输入数字
function inputHandler(){
    this.value=this.value.replace(/\D/g,"");
}
function clickHandler(){
    var div0=document.getElementById("div0");
    //timer为输入时间的总秒数
    timer=inputs[0].value*3600+inputs[1].value*60+inputs[2].value;
    //设置定时器
    inter = setInterval(animation,1000,div0);
    //将input设置为不可输入
    setDisabled(true);
}
function animation(elem){
    //让毫秒差每一秒减1
    timer--;
    //计算要显示的时间
    var h=timer>=3600? parseInt(timer/3600) : 0;
    var m=timer-h*3600>=60? parseInt(timer/60) : 0;
    var s=parseInt(timer-h*3600-m*60);
    //如果倒计时结束,将input设置为可输入,清除定时器
    if(timer<=0){
        setDisabled(false);
        clearInterval(inter);
    }
    //将内容显示
    elem.innerHTML="倒计时:"+h+"小时"+m+"分"+s+"秒";
}
//控制input是否可输入
function setDisabled(bool){
    for(var i=0;i<inputs.length;i++){
        inputs[i].disabled=bool;
    }
}

这种方法比较好理解,缺点是使用定时器来计算时间,会有比较大的误差,下面来看第二种方法:

var inputs,fDate;
init();
function init(){
    //获取页面中的所有input
    inputs=document.getElementsByTagName("input");
    //获取按钮
    var btn=document.getElementById("btn");
    //获取显示的内容div
    var div0=document.getElementById("div0");
    //给input添加oninput事件,让它只输入数字
    for(var i=0;i<inputs.length;i++){
        inputs[i].oninput=inputHandler;
    }
    //设置定时器
    setInterval(animation,500,div0);
    //按钮添加点击事件
    btn.onclick=btnHandler;
}
//正则控制input的输入内容
function inputHandler(){
    this.value=this.value.replace(/\D/g,"");
}
function btnHandler(){
    //获取到输入时间段对应的未来时间
    fDate=new Date();
    fDate.setHours(fDate.getHours()+Number(inputs[0].value));
    fDate.setMinutes(fDate.getMinutes()+Number(inputs[1].value));
    fDate.setSeconds(fDate.getSeconds()+Number(inputs[2].value));
    //让input设置为不可输入
    setDisabled(true);
}
function animation(elem){
    //如果没有设置时间,则直接返回
    if(!fDate) return;
    //获取到当前时间距离未来的时间差
    var nDate=new Date();
    var secondDiff=(fDate-nDate)/1000;
    //如果时间差小于0,设置input为可输入
    if(secondDiff<=0){
        fDate=null;
        setDisabled(false);
        return;
    }
    //计算要显示的时、分秒
    var h=secondDiff>=3600? parseInt(secondDiff/3600) : 0;
    var m=secondDiff>=60? parseInt((secondDiff-h*3600)/60) : 0;
    var s=parseInt(secondDiff-h*3600-m*60);
    elem.innerHTML="倒计时:"+h+"小时"+m+"分"+s+"秒";
}
//设置input是否可输入
function setDisabled(bool){
    for(var i=0;i<inputs.length;i++){
        inputs[i].disabled=bool;
    }
} 

这种方法相比第一种方法,误差更小。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值