/*
* 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>天 '
+
'<span class="red">'
+ data[1]+
'</span>小时 '
+
'<span class="red">'
+ data[2]+
'</span>分 '
+
'<span class="red">'
+ data[3]+
'</span>秒 '
;
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>小时 '
+
'<span class="red">'
+ arr[1]+
'</span>分 '
+
'<span class="red">'
+ arr[2]+
'</span>秒 '
;
fish.all(
"#countDown"
).html(htmStr);
});
效果: