欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

原生js实现倒计时功能(多种格式调用)

程序员文章站 2023-11-20 09:19:10
话不多说,请看代码:

话不多说,请看代码:

<!doctype html>
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>倒计时-多种格式调用-原生js封装</title>
 <link rel="shortcut icon" href="../public/image/favicon.ico" type="images/x-icon"/>
 <link rel="icon" href="../public/image/favicon.png" type="images/png"/>
 <link rel="stylesheet" type="text/css" href="../public/style/cssreset-min.css">
 <link rel="stylesheet" type="text/css" href="../public/style/common.css">
 <style type="text/css">
 /*公共*/
 html{
  height:100%;
 }
 body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td {
  margin: 0;
  padding: 0
 }
 ol, ul {
  list-style: none
 }
 body{
  position: relative;
  min-height:100%;
  font-size:14px;
  font-family: tahoma, verdana,"microsoft yahei";
  color:#333;
 }
 a{
  text-decoration: none;
  color:#333;
 }
 .header{
  width: 960px;
  padding-top: 15px;
  margin: 0 auto;
  line-height: 30px;
  text-align: right;
 }
 .header a{
  margin: 0 5px;
 }
 .main{
  width:960px;
  margin: 50px auto 0;
 }
 .code{
  border:1px dashed #e2e2e2;
  padding:10px 5px;
  margin-bottom:25px;
 }
 pre {
  font-family: "microsoft yahei",arial,helvetica;
  white-space: pre-wrap; /*css-3*/ 
  white-space: -moz-pre-wrap; /*mozilla,since1999*/ 
  white-space: -pre-wrap; /*opera4-6*/ 
  white-space: -o-pre-wrap; /*opera7*/ 
  word-wrap: break-word; /*internetexplorer5.5+*/
 }
 .example{
  padding-top:40px;
  margin-bottom:90px;
 }
 .example .call{
  padding:18px 5px;
  background:#f0f5f8;
 }
 .example h2{
  padding-top:20px;
  margin-bottom:7px;
 }
 .example table {
  width:100%;
  table-layout:fixed;
  border-collapse: collapse;
  border-spacing: 0;
  border: 1px solid #cee1ee;
  border-left: 0;
 }
 .example thead {
  border-bottom: 1px solid #cee1ee;
  background-color: #e3eef8;
 }
 .example tr {
  line-height: 24px;
  font-size: 13px;
 }
 .example tr:nth-child(2n) {
  background-color: #f0f5f8;
 }
 .example tr th,.example tr td {
  border-left: 1px solid #cee1ee;
  word-break: break-all;
  word-wrap: break-word;
  padding:0 10px;
  font-weight: normal;
 }
 .example tr th {
  color: #555;
  padding-top: 2px;
  padding-bottom: 2px;
  text-align: left;
 }
 /*公共*/
 .countdown {
  margin-bottom: 15px;
 }
 </style>
 <script type="text/javascript">
 /*封装代码*/
 (function() {
  var countdown = function(el, opts) {
  var self = this;
  var defaults = {
   'format': 'hh:mm:ss',   //格式
   'endtime': '',    //结束时间
   'interval': 1000,   //多久倒计时一次 单位:ms
   'starttime':r(el)[0].innerhtml,  //开始时间
   'counteach': function(time) {  //每单位时间出发事件,传入一个对象,包含时间信息(month)和时间格式化输出(format)
   r(el)[0].innerhtml=time['format']
   },
   'countend':function (time) {}  //倒计时结束回调事件
  }
  opts = opts || {};
  for (var w in defaults) {
   if ("undefined" == typeof opts[w]) {
   opts[w] = defaults[w];
   }
  }
  this.params = opts;
  this.container = r(el);

  if (this.container.length > 1) {
   var x = [];
   return this.container.each(function() {
   x.push(new countdown(this, opts))
   }), x
  }
  this._hander=null;
  this._start=0;
  this._end=0;
  this.istimestamp = isnan(this.params.starttime)||isnan(this.params.endtime);//是否为秒计数模式
  this.init();
  }
  countdown.prototype = {
  //初始化
  init: function() {
   var self = this;
   this.reset();
  },
  reset:function(){
   var self = this;
   if (this.istimestamp) {
   this._start = this.params.starttime ? this.gettimestamp(this.params.starttime) : (+new date());
   this._end = this.gettimestamp(this.params.endtime);
   } else {
   this._start = this.params.starttime * 1e3;
   this._end = this.params.endtime * 1e3;
   }
   this.count();
  },
  count:function(){
   var self = this;
   this._hander = setinterval(function(){
   self._start-=self.params.interval;
   self.params.counteach(self.gettime(self._start));
   if(self._start<=self._end){
    clearinterval(self._hander);
    self.params.countend();
   }
   },self.params.interval);
  },
  //获取时间戳
  gettimestamp:function(str){
   return +new date(str)||+new date('1970/1/1 '+str);
  },
  timeformat:function(fmt,timestamp){
   var date = new date(timestamp);
   var o = {
   "m+" : date.getmonth()+1,   //月份
   "d+" : date.getdate(),   //日
   "h+" : date.gethours(),   //小时
   "m+" : date.getminutes(),   //分
   "s+" : date.getseconds(),   //秒
   "q+" : math.floor((date.getmonth()+3)/3), //季度
   "s" : date.getmilliseconds()  //毫秒
   };
   if(/(y+)/.test(fmt)){
   fmt=fmt.replace(regexp.$1, (date.getfullyear()+"").substr(4 - regexp.$1.length));
   }
   for(var k in o){
   if(new regexp("("+ k +")").test(fmt)){
    fmt = fmt.replace(regexp.$1, (regexp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
   }
   }
   return fmt;
  },
  gettime: function(timestamp) {
   var self = this;
   var date, format;
   if (this.istimestamp) {
   date = new date(timestamp);
   format = self.timeformat(self.params.format, timestamp);
   } else {
   date = new date();
   format = timestamp / 1e3;
   }
   return {
   'year': date.getfullyear(),
   'month': date.getmonth() + 1,
   'day': date.getdate(),
   'hour': date.gethours(),
   'minute': date.getminutes(),
   'second': date.getseconds(),
   'quarter': math.floor((date.getmonth() + 3) / 3),
   'microsecond': date.getmilliseconds(),
   'format': format
   };
  }
  }
  var r = (function() {
  var e = function(e) {
   var a = this,
   t = 0;
   for (t = 0; t < e.length; t++) {
   a[t] = e[t];
   }
   return a.length = e.length, this
  };
  e.prototype = {
   addclass: function(e) {
   if ("undefined" == typeof e) return this;
   for (var a = e.split(" "), t = 0; t < a.length; t++)
    for (var r = 0; r < this.length; r++) this[r].classlist.add(a[t]);
   return this
   },
   each: function(e) {
   for (var a = 0; a < this.length; a++) e.call(this[a], a, this[a]);
   return this
   },
   html: function(e) {
   if ("undefined" == typeof e) return this[0] ? this[0].innerhtml : void 0;
   for (var a = 0; a < this.length; a++) this[a].innerhtml = e;
   return this
   },
   find: function(a) {
   for (var t = [], r = 0; r < this.length; r++)
    for (var i = this[r].queryselectorall(a), s = 0; s < i.length; s++) t.push(i[s]);
   return new e(t)
   },
   append: function(a) {
   var t, r;
   for (t = 0; t < this.length; t++)
    if ("string" == typeof a) {
    var i = document.createelement("div");
    for (i.innerhtml = a; i.firstchild;) this[t].appendchild(i.firstchild)
    } else if (a instanceof e)
    for (r = 0; r < a.length; r++) this[t].appendchild(a[r]);
   else this[t].appendchild(a);
   return this
   },
  }
  var a = function(a, t) {
   var r = [],
   i = 0;
   if (a && !t && a instanceof e) {
   return a;
   }
   if (a) {
   if ("string" == typeof a) {
    var s, n, o = a.trim();
    if (o.indexof("<") >= 0 && o.indexof(">") >= 0) {
    var l = "div";
    for (0 === o.indexof("<li") && (l = "ul"), 0 === o.indexof("<tr") && (l = "tbody"), (0 === o.indexof("<td") || 0 === o.indexof("<th")) && (l = "tr"), 0 === o.indexof("<tbody") && (l = "table"), 0 === o.indexof("<option") && (l = "select"), n = document.createelement(l), n.innerhtml = a, i = 0; i < n.childnodes.length; i++) r.push(n.childnodes[i])
    } else
    for (s = t || "#" !== a[0] || a.match(/[ .<>:~]/) ? (t || document).queryselectorall(a) : [document.getelementbyid(a.split("#")[1])], i = 0; i < s.length; i++) s[i] && r.push(s[i])
   } else if (a.nodetype || a === window || a === document) {
    r.push(a);
   } else if (a.length > 0 && a[0].nodetype) {
    for (i = 0; i < a.length; i++) {
    r.push(a[i]);
    }
   }
   }
   return new e(r)
  };
  return a;
  }())

  window.countdown = countdown;
 })()
 /*封装代码*/
 </script>
</head>
<body>
 <div class="header">
 <a href="https://github.com/huanghanzhilian/widget" target="_blank">项目地址</a>
 <a href="/widget/">返回首页</a>
 </div>
 <div class="main">
 <div class="countdown">
  <p>#例子1# 12:00:00到11:50:00</p>
  <p id="countdown" class="">12:00:00</p>
 </div>
 <script type="text/javascript">
  new countdown("#countdown", {
  endtime: '11:50:00'
  });
 </script>
 <div class="code">
  <p>
  endtime: '11:50:00',设置结束时间/默认值为空||0,执行其他默认参数
  </p>
  <p>new countdown("#countdown", {
  endtime: '11:50:00'
  });</p>
 </div>
 <div class="countdown">
  <p>#例子2# 60到50</p>
  <p id="countdown1" class="">60</p>
 </div>
 <script type="text/javascript">
  new countdown("#countdown1", {
  endtime: '50',
  countend: function() {
   alert("结束")
  }
  });
 </script>
 <div class="code">
  <p>
  countend: 'function',设置结束倒计时后触发的函数/默认值为空,执行其他默认参数
  </p>
  <p>new countdown("#countdown1", {
  endtime: '50',
  countend: function() {
   alert("结束")
  }
  });</p>
 </div>
 <div class="countdown">
  <p>#例子3# 60到0</p>
  <p id="countdown2" class=""></p>
 </div>
 <script type="text/javascript">
  new countdown("#countdown2", {
  starttime:'60'
  });
 </script>
 <div class="code">
  <p>
  starttime:'60',设置开始时间/默认值为元素内容,执行其他默认参数
  </p>
  <p>new countdown("#countdown2", {
  starttime:'60'
  });</p>
 </div>
 <div class="countdown">
  <p>#例子4# 2017/01/11,11:00:00到1970/1/1</p>
  <p id="countdown3" class="">2017/01/11,11:00:00</p>
 </div>
 <script type="text/javascript">
  new countdown("#countdown3", {
  format:'yy:mm:dd:hh:mm:ss'
  });
 </script>
 <div class="code">
  <p>
  format:'yy:mm:dd:hh:mm:ss',格式化输出的时间格式/默认值为'hh:mm:ss',执行其他默认参数
  </p>
  <p>new countdown("#countdown3", {
  format:'yy:mm:dd:hh:mm:ss'
  });</p>
 </div>
 <div class="example">
  <div class="call">
  <h1>调用方法:</h1>
  <p>new countdown(selector,{options});</p>
  </div>
  <h2>options参数</h2>
  <table>
  <thead>
   <tr>
   <th width="150">参数</th>
   <th width="100">默认值</th>
   <th>说明</th>
   </tr>
  </thead>
  <tbody>
   <tr>
   <td>format</td>
   <td>'hh:mm:ss'</td>
   <td>格式化输出的时间格式,年(y)、月(m)、日(d)、小时(h)、分(m)、秒(s)、毫秒(s)、季度(q)</td>
   </tr>
   <tr>
   <td>starttime</td>
   <td>''</td>
   <td>开始时间</td>
   </tr>
   <tr>
   <td>endtime</td>
   <td>''</td>
   <td>结束时间</td>
   </tr>
   <tr>
   <td>interval</td>
   <td>1000</td>
   <td>计数的时间间隔(单位:毫秒)</td>
   </tr>
   <tr>
   <td>counteach(time)</td>
   <td>[时间格式化输出]</td>
   <td>每计时单位执行,其中time包含时间信息:year年、quarter季度、month月、day日、hour小时、minute分钟、second秒、microsecond毫秒、format格式化输出</td>
   </tr>
   <tr>
   <td>countend(time)</td>
   <td>[时间格式化输出]</td>
   <td>计时结束后执行,其中time包含时间信息:year年、quarter季度、month月、day日、hour小时、minute分钟、second秒、microsecond毫秒、format格式化输出</td>
   </tr>
  </tbody>
  </table>
 </div>
 </div>
</body>
</html>

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