可扩展定制可复用的倒计时插件

倒计时功能在网站开发过程中经常遇到,像各大电商网站做促销或者团购网站,经常看到距离活动结束还剩多少天,多少小时,多少分钟,多少秒。因些我最近写了一个插件,方便日后使用和扩展,由于提高开发速度,我基于jquery库利于面向对象的思想开发了。

这个倒计时插件js我给它起名为countDown,使用起来非常方便,只需配置几个参数而已,支持开始时间自定义,写好了与后台数据对接的接口,用这个插件可谓是省事再省事,省时再省时了,呵呵。

下面直接上代码:

/**
* @Name:   易维护、可扩展定制的 倒计时插件
* @Author:  大兵博客(虾兵) @Blog:http://ddbing.com/
* @param   参数暂支持三个,cid,data,nowDate。
* @param   cid: 倒计时模块id,以区分多个倒计时模块的情况。
* @param   nowDate: 开始时间,不设置则默认为系统当前时间。
* @param   data: 初始化后台传过来的活动结束时间数据,JSON格式如:
     [
         { "id":"1",time:"2015/09/05 10:27:30" },
         { "id":"2",time:"2015/09/09 09:08:40" },
         { "id":"3",time:"2015/06/03 12:30:10" }
     ];
*/
;( function  ($, window, document, undefined) {
 
     var  countDown =  function (cid,data,nowDate){
         this .cid = cid;
         this .data = data;
         this .nowDate = nowDate;
     };
 
     countDown.prototype = {
         constructor: countDown,
         main:  function (){
             var  that =  this , data, newData = [];
             this .init();
             data = that.backData;
             that.initTemp(data);
             that._init ? that._init =  false : '' ;
             $.each(data, function (i,val){
                 if  (val.ms) {
                     newData.push({id:val.id,ms:val.ms});
                 };
             });
             that.backData = newData;
             setTimeout( function (){
                 that.handle();
             },1000);
         },
         
         //初始化处理
         init:  function (){
             var  that =  this , data = that.data, backData=[], ms = 0, msEnd, msNow, _init = that._init =  true ;
             msNow = (  new  Date(that.nowDate) ).getTime() || (  new  Date() ).getTime();
             $.each(data, function (i,val){
                 msEnd =(  new  Date(val.time) ).getTime();
                 ms = msEnd - msNow;
                 if  ( ms < 1000 ) {
                     that.msHandle(ms,val.id, '-1' );
                 } else {
                     that.msHandle(ms,val.id);
                 };
                 
             });
         },
 
         //初始转化时间格式
         msHandle:  function (ms,id,flag){
             var  D, H, M, S, objTime = {}, backData =  this .backData ||  [] ;
            if  (flag < 0) {
                  objTime = {
                    id: id,
                    no: flag
                 };
                  backData.push(objTime);
            } else {
                 S = Math.floor( ms/1000 );
                 M = Math.floor( S/60 );
                 H = Math.floor( M/60 );
                 D = Math.floor( H/24 );
                 S = S % 60;
                 M = M % 60;
                 H = H % 24;
                 objTime = {
                     id:id,
                     D:D,
                     H:H,
                     M:M,
                     S:S,
                     ms:ms
                 };
                 objTime =  this .normTime(objTime);
                 backData.push(objTime);
             };
             this .backData = backData;
             return  this ;
         },
 
         //倒计时定时器
         handle:  function (){
             var  that =  this , timer, data = that.backData, cid =  this .cid;
             $.each(data, function (i,val){
                 var  ms = val.ms;
                 if  (ms < 1000) {
                     $( '#' +cid).find( '#count' +val.id).html( '距离活动结束还剩:活动已结束' );
                 } else {
                     ms -= 1000;
                     that.msChange(ms, val.id);
                     data[i].ms = ms;
                 };
             });
             !!timer && clearTimeout(timer);
             timer = setTimeout( function (){
                 that.handle();
             },1000);
         },
 
         //ms处理
         msChange:  function (ms,id){
             var  D, H, M, S, objTime = {},cid =  this .cid, data =  this .backData;
             S = Math.floor( ms/1000 );
             M = Math.floor( S/60 );
             H = Math.floor( M/60 );
             D = Math.floor( H/24 );
             S = S % 60;
             M = M % 60;
             H = H % 24;
             objTime = {
                 id:id,
                 D:D,
                 H:H,
                 M:M,
                 S:S
             };
             objTime =  this .normTime(objTime);
             $( '#' +cid).find( '#count' +id).children( '.d' ).children( 'i' ).text( objTime.D );
             $( '#' +cid).find( '#count' +id).children( '.h' ).children( 'i' ).text( objTime.H );
             $( '#' +cid).find( '#count' +id).children( '.m' ).children( 'i' ).text( objTime.M );
             $( '#' +cid).find( '#count' +id).children( '.s' ).children( 'i' ).text( objTime.S );
         },
 
         //统一处理时刻格式
         normTime:  function (objTime){
             for  ( var  in  objTime) {
                 if  (objTime.hasOwnProperty(i) && i !=  'id' ) {
                     objTime[i] = objTime[i] < 10  ?  '0'  + objTime[i] : objTime[i];
                 };
             };
             return  objTime;
         },
 
         //初始化模板
         initTemp:  function (data){
             var  temp =  '' ;
             $.each(data, function (i,val){
                 if  (val.no < 0) {
                     temp += '距离活动结束还剩:活动已结束' ;
                 } else {
                     temp += '距离活动结束还剩:' + val.D + '天'
                            + '' + val.H + '时' + val.M + '分'
                            + '' + val.S + '秒'
                        + '' ;
                 };
             });
             temp += '' ;
             $( '#' + this .cid).append(temp);
         }
     };
     window.countDown = countDown;
}(jQuery, window, document));

这段代码就不多解释了,参数上面一段备注已很详细,js中每个功能函数也有备注。

HMTL中调用方式如下:

var  time_data = [
         "id" : "1" ,time: "2015/09/05 10:27:30"  },
         "id" : "2" ,time: "2015/09/09 09:08:40"  },
         "id" : "3" ,time: "2015/06/03 12:30:10"  },
         "id" : "4" ,time: "2015/10/12 13:15:30"  },
         "id" : "5" ,time: "2015/09/11 18:36:40"  }
     ];
/**
* @param 创建倒计时对象
* @param 倒计时模块id:countdown1
* @param 倒计时初始化数据
* @param 最后一个参数倒计时开始时间,格式如:"2015/09/03 10:30:00",不传则默认为系统当前时间
*/
var  tCountDown =  new  countDown( 'countdown1' ,time_data, '2015/09/03 10:30:00' );
tCountDown.main();

这个插件你可以用到你网站的任何地方,商业非商业都行,不过恳请仁兄使用时保留备注或者注明代码来源,以对我写代码的鼓励及脑细胞的补偿,也方便日后迭代更新。使用时样式皮肤自行美化。

如果这篇文章对您有帮助,请前去 Github 点亮星星 star 来鼓励我写下去的勇气

转载于:https://www.cnblogs.com/liqingbo/p/4824447.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值