JavaScript倒计时组件

我是研究僧i 提交于 2020-03-30 02:06:09

序言:倒计时应用于各网站页面,普遍存在,用过别人写的库(复杂)组件,也怕自己写的不好,今天又遇到一个倒计时的需求,因此打算自己写一遍。
作者:华子yjh

 

一、组件API

1、组件调用方式

countDown(targetTime, callback(d, h, m, s)); // 组件调用方式

 

2、参数(Params)说明

targetTime: // 用户设置倒计时的目标时间

callback(d, h, m, s): // 回调函数,其参数分别为倒计时间中的天、小时、分钟、秒值

 

二、使用案例

1、HTML结构

<div id="countdown"></div>

 

2、JavaScript代码

var targetTime = '2013/03/15 18:00:00'; // 大于本地时间(假如本地时间为:2013/3/14 16:10:00)countDown(targetTime, function(d, h, m, s) {
    // 补零
    for (var i = 0, len = arguments.length; i < len; i++) {
        if (String(arguments[i]).length < 2) {
            arguments[i] = '0' + arguments[i];
        }
    }
    // dom操作
    var dom = document.getElementById('countdown');
    dom.innerHTML = d + '天' + h + '小时' + m + '分钟' + s + '秒';
});

 

3、浏览器显示结果

dom元素内容为:01天01小时50分钟00秒

 

三、组件源码

function countDown(targetTime, callback) {

    // 定义一个创建XHR对象的函数
    function createXHR() {
        if (typeof XMLHttpRequest !== 'undefined') {
            createXHR = function() {
                return new XMLHttpRequest();
            };
        } else if (typeof ActiveXObject !== 'undefined') {
            createXHR = function() {
                if (typeof arguments['activeXString'] !== 'string') {
                    var versions = ['MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'];

                    for (var i = 0, len = versions.length; i < len; i++) {
                        try {
                            var xhr = new ActiveXObject(versions[i]);
                            arguments['activeXString'] = versions[i];
                            return xhr;
                        } catch(e) {}
                    }
                }
                return new ActiveXobject(arguments['activeXString']);
            };
        }
        return createXHR();
    }

    // 创建一个XHR对象
    var xhr = createXHR();
    xhr.open('HEAD', window.location.href); // 建立一个请求
    xhr.send(null); // 发送请求
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                var t_timestamp = Date.parse(targetTime),
                serverTime = new Date(xhr.getResponseHeader('Date')),
                s_timestamp = Date.parse(serverTime),
                c_timestamp = t_timestamp - s_timestamp; // 倒计时间戳
                if (c_timestamp > 0) {
                    setTimeout(function callee() {
                        countdownTime(c_timestamp);
                        if (c_timestamp > 0) {
                            c_timestamp -= 1000;
                            setTimeout(callee, 1000);
                        }
                    }, 1);
                }
            }
        }
    };

    // 计算倒计时间(天,小时,分钟,秒),并传入回调函数,执行回调
    function countdownTime(c_timestamp) {
        var d, h, m, s;
        c_timestamp = c_timestamp / 1000;

        d = parseInt(c_timestamp / 3600 / 24, 10); // 天数
        h = parseInt(c_timestamp / 3600 % 24, 10); // 小时
        m = parseInt(c_timestamp % 3600 / 60, 10); // 分钟
        s = parseInt(c_timestamp % 3600 % 60, 10); // 秒
        if (typeof callback === 'function') {
            callback(d, h, m, s);
        }
    }
};

 

四、PS源码

源码解读:

1、创建XHR对象函数为自定义函数,也称惰性载入函数,该函数代码来自JavaScript高级程序设计一书,但是去除了arguments.callee写法,原因是ES5不支持;2、组件中的第二个参数作为函数执行,该函数称为回调函数(运用闭包,将程序中通过复杂计算后的变量传入回调中,方便操作);3、如果你没有看源码就测试的话,需要一个本地服务器来测试;如果你认为代码中有优化的地方,盼PS!

 

转载请注明来自博客园:华子yjh原文链接

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!