js多功能倒计时方法

来源:luqidong 发布时间:2014-03-10 17:05:25 点击数:
/*
 * times {number|Date|Array} 类型是number,表示以毫秒为单位的时间值
 *    是Date,表示过期的时间
 *    是Array,表示时间数组,格式为[day, hour, minute, second],长度可以小于4,但是不能大于4
 *  fn {function} 回调函数,接受一个参数times,类型是Array,格式为[day, hour, minute, second],如果第一个参数times传递是Array,格式与其保持一致,
 *       例如,times传递了[minute, second],则该参数也是[minute, second],如果第一个参数times传递的是number和Date,则是完成的格式,达不到0填充
 *  endFn {function} 倒计时结束执行的函数,接受一个参数times,类型是Array,格式为[day, hour, minute, second],如果第一个参数times传递是Array,格式与其保持一致,
 *       例如,times传递了[minute, second],则该参数也是[minute, second],如果第一个参数times传递的是number和Date,则是完成的格式,达不到0填充
 */
function countDown(times, fn, endFn) {
    if (typeof times === "number") {
        times = calculateTime(times);
    } else if (Object.prototype.toString.apply(times) === "[object Date]") {
        times = calculateTime(times.getTime() - new Date().getTime());
    }
    fn(times); // 一开始先执行一次
    var intervalMac = setInterval(function() {
        var timesLen = times.length,
            scales = [24, 60, 60],
            scalesLen = scales.length;
        for (var i = timesLen; i--;) {
            if (times[i] > 0) {
                times[i] = times[i] - 1;
                break;
            }
            // 等于0,非首位的处理
            if (i !== 0) {
                times[i] = scales[scalesLen - (timesLen - i)] - 1;
            } else { // 一直到首位都为0,倒计时结束
                for (var j = 0; j < times.length; j++) {
                    times[j] = 0;
                }
                clearInterval(intervalMac);
                return;
            }
        }
        fn(times);
        if (typeof endFn === "function") {
            var isEnd = true;
            for (var i = 0, len = times.length; i < len; i++) {
                if (times[i] !== 0) {
                    isEnd = false;
                    break;
                }
            }
            if (isEnd) {
                endFn(times);
            }
        }
    }, 1000);
}
//把毫秒转换成数组[day, hour, minute, second]
function calculateTime(time) {
    if (time < 0) {
        return [0, 0, 0, 0];
    }
    time = Math.floor(time / 1000);
    var times = [],
        scales = [86400, 3600, 60];
    for (var i = 0; i < scales.length; i++) {
        times.push(Math.floor(time / scales[i]));
        time %= scales[i];
    }
    times.push(time);
    return times;
}
使用方法:
1、countDown(132000,function(data){
    var htmStr = '<p class = "lowtitle">倒计时还剩</p>'+
                    '<span class="red">'+ data[0]+'</span>天&nbsp;&nbsp;'+
                    '<span class="red">'+ data[1]+'</span>小时&nbsp;&nbsp;'+
                    '<span class="red">'+ data[2]+'</span>分&nbsp;&nbsp;'+
                    '<span class="red">'+ data[3]+'</span>秒&nbsp;&nbsp;';
        fish.all("#countDown").html(htmStr);
},function(){
    alert("over");
});
2、countDown([1,5,41],function(arr){
    var htmStr = '<p class = "lowtitle">倒计时还剩</p>'+
                    '<span class="red">'+ arr[0]+'</span>小时&nbsp;&nbsp;'+
                    '<span class="red">'+ arr[1]+'</span>分&nbsp;&nbsp;'+
                    '<span class="red">'+ arr[2]+'</span>秒&nbsp;&nbsp;';
        fish.all("#countDown").html(htmStr);
});
效果:
78OA办公系统
本文由免费oa系统78oa原创,转载请注明出处。