全网整合营销服务商

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

免费咨询热线: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 


相关文章: 长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何快速搭建虚拟主机网站?新手必看指南  制作销售网站教学视频,销售网站有哪些?  如何登录建站主机?访问步骤全解析  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何通过云梦建站系统实现SEO快速优化?  如何做静态网页,sublimetext3.0制作静态网页?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何快速搭建高效WAP手机网站?  如何在阿里云虚拟主机上快速搭建个人网站?  微信小程序 input输入框控件详解及实例(多种示例)  建站10G流量真的够用吗?如何应对访问高峰?  山东网站制作公司有哪些,山东大源集团官网?  建站之星安装后如何自定义网站颜色与字体?  如何通过山东自助建站平台快速注册域名?  python的本地网站制作,如何创建本地站点?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  制作网站的软件免费下载,免费制作app哪个平台好?  如何选择服务器才能高效搭建专属网站?  宿州网站制作公司兴策,安徽省低保查询网站?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  如何在服务器上配置二级域名建站?  建站主机服务器选型指南与性能优化方案解析  建站主机助手选型指南:2025年热门推荐与高效部署技巧  孙琪峥织梦建站教程如何优化数据库安全?  css网站制作参考文献有哪些,易聊怎么注册?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  建站之星与建站宝盒如何选择最佳方案?  怀化网站制作公司,怀化新生儿上户网上办理流程?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何选择高性价比服务器搭建个人网站?  如何高效利用亚马逊云主机搭建企业网站?  已有域名如何快速搭建专属网站?  如何选择网络建站服务器?高效建站必看指南  网站微信制作软件,如何制作微信链接?  Bpmn 2.0的XML文件怎么画流程图  高端网站建设与定制开发一站式解决方案 中企动力  购物网站制作公司有哪些,哪个购物网站比较好?  用v-html解决Vue.js渲染中html标签不被解析的问题  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  专业公司网站制作公司,用什么语言做企业网站比较好?  已有域名和空间如何搭建网站?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  婚礼视频制作网站,学习*后期制作的网站有哪些?  网站制作报价单模板图片,小松挖机官方网站报价?  PHP 500报错的快速解决方法  如何设置并定期更换建站之星安全管理员密码?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南 

您的项目需求

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