CountDown 持久化的倒计时类实现

2018-06-06  本文已影响16人  TOPro

即无视页面是否刷新的倒计时

在线调试:https://codepen.io/ccwq/pen/YvWxRN?editors=0011


var text = document.getElementById("text");
var couterMax = 10000;
text.innerText = 0;
var countDown = new CountDown({
  cacheKey:"cache-key",
  startTime:couterMax,
  stepHandler(value){
    text.innerText = parseInt(value/1000)
  },
  timeupHandler(){
    text.innerText = 0;
  },
  startHandler(){
    text.innerText = couterMax;
  }
})

const defaultOptions = {
    timeupHandler   :   function(){},
    resetHandler    :   function(){},
    stepHandler     :   function(timesToTarget){},
    startHandler    :   function(){},

    //倒计时的最大
    startTime       :   60*1000,
    interval        :   1000,

    //用来实现页面刷新后的缓存
    cacheKey        :   ""
}

const CountDown = class{
    constructor(options){
        var m = this;
        m.options = Object.assign({},defaultOptions,options);
        m._state = "stoping";

        /**
         * 当设备时间到达此刻,计时完成
         */
        m._targetTimes;

        //自动进入倒计时状态
        var cacheTargetValue = m.revertTargetValue();
        if(cacheTargetValue && cacheTargetValue>new Date()*1){
            m.start();
        }
    }

    start(){
        var m = this;
        var newTarget = m.options.startTime + new Date()*1;
        if (m.options.cacheKey) {
            var target = m.revertTargetValue();
            if (!target) {
                target = newTarget;
            }else if(new Date() > target) {
                target = newTarget;
            }
            localStorage.setItem(m.options.cacheKey,target);
            m._targetTimes = target;
        }else{
            m._targetTimes = newTarget;
        }
        m.options.startHandler.call(m)
        m._state = "running";
        m._step();
    }

    reset(noTriggerCallback=true){
        var m = this;
        if (m._timeout) clearTimeout(m._timeout);
        if (m.options.cacheKey) localStorage.setItem(m.options.cacheKey,"")
        m._targetTimes  =   undefined;
        m._state        =   "stoping";
        if (!noTriggerCallback) m.options.resetHandler.call(m);
    }


    _step(){
        var m = this;
        var distance = m._targetTimes - new Date()*1;
        m.options.stepHandler.call(m,distance);

        //倒计时已经完成
        if (distance <= 0) {
            m._state == "stoping";
            m.options.timeupHandler.call(m);
        }else{
            m._timeout = setTimeout(function(){
                if (m._state == "running") {
                    m._step();
                }
            },m.options.interval)
        }
    }

    /**
     * 从缓存恢复数据
     * @returns {number}
     */
    revertTargetValue(){
        var m = this;
        if(!m.options.cacheKey) return;
        var value = localStorage.getItem(m.options.cacheKey);
        value = parseInt(value);
        if (isNaN(value)) return;
        return value;
    }
}

export default CountDown;
上一篇下一篇

猜你喜欢

热点阅读