全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

纯js实现倒计时功能

通过js实现页面的倒计时功能。

思路: 传入一个秒数c,c/60可以得到分钟m, c%60可以得到显示的秒数s,同理,再将m/60可是得到小时数, m/%可以得到分钟数。通过setInterval每次将总秒数-1,并将计算所得时间显示到页面上。

第一版的肮脏代码如下, 可以作为反面教材思考一下

<html> 
  <head> 
    <title>Tomato</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <script type="text/javascript"> 
      var vTimeLength = 5; 
      var vHour; 
      var vMinutes; 
      var vSeconds; 
      var vRemainingTime; 
      function countDown(){ 
        vTimeLength = vTimeLength - 1; 
        vMinutes = Math.floor(vTimeLength/60); 
        vSeconds = Math.floor(vTimeLength%60); 
        if (vMinutes >= 60){ 
          vHour = Math.floor(vMinutes/60); 
          var vMinutesNew = Math.floor(vMinutes%60); 
          vRemainingTime = vHour + ":" + vMinutesNew + ":" + vSeconds; 
        } else { 
          vRemainingTime = vMinutes + ":" + vSeconds; 
        } 
        document.getElementById("div_countDown").innerHTML = vRemainingTime; 
        if (vTimeLength < 1) { 
          alert('do sth'); 
        } 
      } 
    </script> 
  </head> 
  <body> 
    <div id="div_countDown"></div> 
    <script type="text/javascript"> 
      setInterval("countDown()", 1000); 
    </script> 
  </body> 
</html> 

缺陷:

 1、定义了众多的全局变量,

 2、没有复用性,

 3、setInterval容易导致队列过多, 结束事件如果是非阻塞事件, 倒计时会继续执行出现负数,

 4、不符合面向对象思想。。。

针对缺陷1的解决方案是, 定义一个函数, 将相关全局变量放到函数内部,使之成为局部变量

针对缺陷2:为函数指定参数,提高复用性。 这里定义了3个参数vTimeLength为倒计时总秒数,showTagId为显示到页面元素的id, callback为倒计时结束后的回掉方法

针对缺陷3:用setTimeout替代setInterval

优化后的代码如下:

<html> 
  <head> 
    <title>countdown</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <script type="text/javascript"> 
      function countDown(vTimeLength, showTagId, callback) { 
        var vHour; 
        var vMinutes; 
        var vMinutesNew 
        var vSeconds; 
        var vRemainingTime; 
        function countDownInner(vTimeLength){ 
          vMinutes = Math.floor(vTimeLength/60); 
          vSeconds = Math.floor(vTimeLength%60); 
          if (vMinutes >= 60){ 
            vHour = Math.floor(vMinutes/60); 
            vMinutesNew = Math.floor(vMinutes%60); 
            vRemainingTime = vHour + ":" + vMinutesNew + ":" + vSeconds; 
          } else { 
            vRemainingTime = vMinutes + ":" + vSeconds; 
          } 
          document.getElementById(showTagId).innerHTML = vRemainingTime; 
          vTimeLength = vTimeLength - 1; 
          if (vTimeLength > 0) { 
            setTimeout(function(){countDownInner(vTimeLength);}, 1000); 
          } else { 
            callback(); 
          } 
        } 
        countDownInner(vTimeLength); 
      } 
    </script> 
  </head> 
  <body> 
    <div id="div_countDown"></div> 
    <script type="text/javascript"> 
      countDown(5, "div_countDown", function(){alert('do sth');}); 
    </script> 
  </body> 
</html> 

这里有一点需要注意

setTimeout(function(){countDownInner(vTimeLength);}, 1000); 

第一次我将此句写成了

setTimeout(countDownInner(vTimeLength), 1000); 

结果函数直接执行了, 没有等待1秒的时间。如果没有入参, 即setTimeout("countDownInner()", 1000); 则可正常执行。

至于前面提到的不够面向对象的缺陷, 也是刚刚接触, 这里贴出代码,希望能够互相交流

<html> 
  <head> 
    <title>count_down</title> 
    <script type="text/javascript"> 
    var countDown = { 
      flag: true,  
      hour: 0, 
      minutes: 0, 
      minutesNew: 0, 
      seconds: 0, 
      show: 0, 
      current: 0, 
      length: 0, 
      showTagId: null, 
      // callback: null, 
      countDownInner: function(vTimeLength){ 
        if (!this.flag) { 
          return; 
        } 
        var that=this; 
        this.current = vTimeLength; 
        minutes = Math.floor(vTimeLength/60); 
        seconds = Math.floor(vTimeLength%60); 
        if (minutes >= 60){ 
          hour = Math.floor(minutes/60); 
          minutesNew = Math.floor(minutes%60); 
          show = hour + ":" + minutesNew + ":" + seconds; 
        } else { 
          show = minutes + ":" + seconds; 
        } 
        document.getElementById(this.showTagId).innerHTML = show; 
        vTimeLength = vTimeLength - 1; 
        if (vTimeLength > 0) { 
          setTimeout(function(){that.countDownInner(vTimeLength);}, 1000); 
        } else { 
          setTimeout(function(){that.callback();}, 1000); 
        } 
      }, 
      run: function(vTimeLength, showTagId, callback) { 
        if (!this.flag) { 
          this.flag = true; 
          this.countDownInner(this.current); 
        } else if (showTagId) { 
          this.length = vTimeLength; 
          this.showTagId = showTagId; 
          this.callback = callback; 
          this.countDownInner(vTimeLength);   
        } 
      }, 
      stop: function(){ 
        this.flag = false; 
      },  
      restart: function(){ 
        this.flag = true; 
        this.countDownInner(this.length); 
      } 
    }; 
    function countDownStart() { 
      countDown.run(); 
    } 
    function countDownStop() { 
      countDown.stop(); 
    } 
    </script> 
  </head> 
  <body> 
    <div id="div_countDown"></div> 
    <script type="text/javascript"> 
      countDown.run(5, 'div_countDown',function(){alert('12')}); 
    </script> 
    <span> 
      <button onclick="countDownStart();">start</button> 
      <button onclick="countDownStop();">stop</button> 
    </span> 
  </body> 
</html> 

一个难点是this的使用, 在函数内部, this是调用当前函数范围,所以setTimeout(function(){this.countDownInner(vTimeLength);}, 1000);会出现undefined。

解决方案是定义一个that变量接收外部函数的this指针,然后通过that即可调用外部域。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # 倒计时  # 纯jsp实现的倒计时动态显示效果完整代码  # JS实现倒计时(天数、时、分、秒)  # PHP+JS实现的商品秒杀倒计时用法示例  # js制作支付倒计时页面  # JavaScript实现刷新不重记的倒计时  # js实现精确到毫秒的倒计时效果  # javascript特效实现——当前时间和倒计时效果的简单实例  # JS/jQ实现免费获取手机验证码倒计时效果  # 点击按钮出现60秒倒计时的简单js代码(推荐)  # js代码实现点击按钮出现60秒倒计时  # 可以得到  # 面向对象  # 复用  # 全局变量  # 并将  # 如果没有  # 不符合  # 将此  # 使之  # 则可  # 再将  # 贴出  # 需要注意  # 容易导致  # 写成了  # 结束后  # 一个函数  # floor  # countDown 


相关文章: 网站制作网站,深圳做网站哪家比较好?  建站三合一如何选?哪家性价比更高?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  网站专业制作公司有哪些,做一个公司网站要多少钱?  已有域名能否直接搭建网站?  定制建站如何定义?其核心优势是什么?  如何通过西部建站助手安装IIS服务器?  常州企业建站如何选择最佳模板?  定制建站流程解析:需求评估与SEO优化功能开发指南  网站制作话术技巧,网站推广做的好怎么话术?  建站之星2.7模板快速切换与批量管理功能操作指南  c# 在高并发下使用反射发射(Reflection.Emit)的性能  建站之星免费版是否永久可用?  建站之星导航如何优化提升用户体验?  已有域名如何快速搭建专属网站?  无锡营销型网站制作公司,无锡网选车牌流程?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  高性能网站服务器部署指南:稳定运行与安全配置优化方案  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  C#如何序列化对象为XML XmlSerializer用法  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何通过智能用户系统一键生成高效建站方案?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  金*站制作公司有哪些,金华教育集团官网?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  开源网站制作软件,开源网站什么意思?  如何设计高效校园网站?  如何做静态网页,sublimetext3.0制作静态网页?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  制作网站的公司有哪些,做一个公司网站要多少钱?  建站之星后台密码遗忘或太弱?如何重置与强化?  javascript中的try catch异常捕获机制用法分析  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  如何高效生成建站之星成品网站源码?  定制建站价位费用解析与套餐推荐全攻略  宝塔面板如何快速创建新站点?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何在香港服务器上快速搭建免备案网站?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  已有域名和空间,如何快速搭建网站?  如何选择高效便捷的WAP商城建站系统?  定制建站哪家更专业可靠?推荐榜单揭晓  活动邀请函制作网站有哪些,活动邀请函文案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。