jquery-countdown插件教程

1.使用:  

    $('#clock').countdown(finalData[, callback(或options)]);  

    finalData - 必选  

    options - 可选  


2.参数:  

1>finalData - 设置倒计时的终止时间  

        3种格式:  

            1)原生的 'Date' 对象  

            2)毫秒格式的 '时间戳'(javascript的时间戳,单位是 '毫秒',切记!)  

                matchers.push(/^[0-9]*$/.source);  

                源码中的正则:  

                    matchers.push(/^[0-9]*$/.source);  

            3)字符串格式的时间  

                YYYY/MM/DD  

                MM/DD/YYYY  

                YYYY/MM/DD hh:mm:ss  

                MM/DD/YYYY hh:mm:ss  

                源码中的正则:   

                    matchers.push(/([0-9]{1,2}\/){2}[0-9]{4}( [0-9]{1,2}(:[0-9]{2}){2})?/.source);  

                    matchers.push(/[0-9]{4}([\/\-][0-9]{1,2}){2}( [0-9]{1,2}(:[0-9]{2}){2})?/.source);  


2>callback(或options) - 回调函数 或者 options 对象  


        1)callback - 倒计时,有3个事件类型,都绑定上回调方法!  

            function(event) {}  


            源码分析:  

                this.$el.on("update.countdown", options);  

                this.$el.on("stoped.countdown", options);  

                this.$el.on("finish.countdown", options);  


        2)options - 传递一个对象,覆盖 'countdown' 的默认配置,默认配置有3个:  

defaultOptions = {  

                precision: 100,         // int  - 更新速率(毫秒为单位)  

                elapse: false,          // bool - 倒计时结束后,是否继续  

                defer: false            // bool - 延迟初始化模式  

            }  


            1.precision - 倒计时的精度  

                源码分析:  

this.interval = setInterval(function() {  

                        self.update.call(self);  

                    }, this.options.precision);     // setInterval()的第二个参数  


            2.elapse - 过期模式  

                false - 一旦到达设定的最终时间,停止计时。(默认)  

                true - 到达最终时间,继续执行倒计时。  

                源码分析:  

if (!this.options.elapse &&this.totalSecsLeft === 0) {     // 到达最终事件  

                        this.stop();                    // 停止计时  

                        this.dispatchEvent("finish");   // 分发 'finish' 事件  

                    } else {  

                        this.dispatchEvent("update");   // 分发 'update' 事件  

                    }  

                    --------  

                    一旦到达终止时间,会传递给事件对象,一个属性:  

                        event.elapsed - 是否已经过期  

this.elapsed = now >= this.finalDate;  


            3.defer - 是否延迟启动  

                false - 表示初始化了 '倒计时对象',会自动开始计时。(默认)  

                true - 在实例化对象后,需要我们来手动启动计时。  

                源码分析:  

if (this.options.defer === false) {  

                        this.start();  

                    }  


3.事件:  

    3个事件方法:  

        update.countdown  

        finish.countdown  

        stoped.countdown            // 这个得说明下,文档中,应该是错误的!源码中是:'stoped',文档中写的是 'stop'  

    3个事件,都有一个 'namespace-命名空间','.countdown'  

    每个事件对象,具备额外的公共属性:  

event.finalDate = this.finalDate;           // 设定的终止时间  

event.elapsed = this.elapsed;               // 是否已经过期  

event.offset = $.extend({}, this.offset);   // 当前时间,在各个时间刻度上的计算  

            源码分析:  

this.offset = {  

                    seconds: this.totalSecsLeft % 60,  

                    minutes: Math.floor(this.totalSecsLeft / 60) % 60,  

                    hours: Math.floor(this.totalSecsLeft / 60 / 60) % 24,  

                    days: Math.floor(this.totalSecsLeft / 60 / 60 / 24) % 7,  

                    daysToWeek: Math.floor(this.totalSecsLeft / 60 / 60 / 24) % 7,  

                    daysToMonth: Math.floor(this.totalSecsLeft / 60 / 60 / 24 % 30.4368),  

                    weeks: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 7),  

                    weeksToMonth: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 7) % 4,  

                    months: Math.floor(this.totalSecsLeft / 60 / 60 / 24 / 30.4368),  

                    years: Math.abs(this.finalDate.getFullYear() - now.getFullYear()),  

                    totalDays: Math.floor(this.totalSecsLeft / 60 / 60 / 24),  

                    totalHours: Math.floor(this.totalSecsLeft / 60 / 60),  

                    totalMinutes: Math.floor(this.totalSecsLeft / 60),  

                    totalSeconds: this.totalSecsLeft  

                };  

event.strftime = strftime(this.offset);     // 格式化时间函数  

            源码分析:  

                function strftime(offsetObject) {  

                    return function(format) {  


                        /*  

                            匹配指令:  

                                %-字母  

                                %!字母  

                                %字母  

                                %字母:其它字符;  

                         */  

vardirectives = format.match(/%(-|!)?[A-Z]{1}(:[^;]+;)?/gi);  

                        if (directives) {  


                            // 对匹配到的每个指令,进行解析  

for (vari = 0, len = directives.length; i < len; ++i) {  

vardirective = directives[i].match(/%(-|!)?([a-zA-Z]{1})(:[^;]+;)?/),   

regexp = escapedRegExp(directive[0]),   // 正则  

modifier = directive[1] || "",          // 模式:- | ! | ""  

plural = directive[3] || "",            // :其他字符; ------ 和 '!' 模式一起使用  

value = null;  

directive = directive[2];               // 表示时间刻度的字母(Y,m,n,d,w...)  


                                // 匹配到了该字母对应的时间值,进行字符替换  

                                if (DIRECTIVE_KEY_MAP.hasOwnProperty(directive)) {  

value = DIRECTIVE_KEY_MAP[directive];  

value = Number(offsetObject[value]);  

                                }  

                                if (value !== null) {  


                                    // '!'模式,执行 'pluralize',会需要 '(:[^;]+;)' 匹配到的值   

if (modifier === "!") {  

value = pluralize(plural, value);  

                                    }  


                                    // ""模式,小于10,填充 '0'  

if (modifier === "") {  

if (value< 10) {  

value = "0" + value.toString();  

                                        }  

                                    }  

format = format.replace(regexp, value.toString());  

                                }  

                            }  

                        }  

format = format.replace(/%%/, "%");  

                        return format;  

                    };  

                }  


                // '!' 模式时,提供对复数的多元化支持,默认复数会添加 's',我们可使用自定义的后缀 '...'  

                function pluralize(format, count) {  

varplural = "s", singular = "";  

                    if (format) {  


                        // 去除:, ; , '空白'。使用 ',' 分隔单数和复数的2种格式  

format = format.replace(/(:|;|\s)/gi, "").split(/\,/);  

if (format.length === 1) {  

plural = format[0];  

                        } else {  

singular = format[0];  

plural = format[1];  

                        }  

                    }  


// 当时间刻度> 1,返回复数格式,否则为单数  

if (Math.abs(count)> 1) {  

                        return plural;  

                    } else {  

                        return singular;  

                    }  

                }  


4.event.strftime - 格式化函数,是一个简单的格式化程序,有助于保持代码更加语义,并且避免重复的工作。  

    它根据给定格式字符串中的指令来格式化偏移日期。 该指令由百分比(%)组成。 未列为指令的任何文本将被传递到输出字符串。  

    event.strftime(%W weeks %-d days %-H h %M min %S sec');  

    /*  

        Y: "years",  

        m: "months",  

        n: "daysToMonth",  

        d: "daysToWeek",  

        w: "weeks",  

        W: "weeksToMonth",  

        H: "hours",  

        M: "minutes",  

        S: "seconds",  

        D: "totalDays",  

        I: "totalHours",  

        N: "totalMinutes",  

        T: "totalSeconds"  

     */  


    所有的指令,包含0填充(01,02,03)和空白填充'1,2,3'版本,默认是0填充,不需要0填充,使用-%D。  

        -  


    模式:  

        -   // 空白填充  

        !   // 多元化复数模式  

            默认:复数添加 's',单数不变  

%!H         // 当 hour>1,结尾添加 's'  

%!H:hours   // 当 hour>1,结尾添加 'hours'  

%!H:hour,hours;     // 当 hour>1,结尾添加 'hours',hour<1,为单数,添加 'hour'。',' 分隔的,前为单数添加的字符,后为复数添加的字符  


5.控制:  

    resume - 恢复  

    pause  - 暂停  

    ------------  

    start  - 开始  

    stop   - 停止  

    pause/resume,本质就是 start/stop 的别名  

    源码分析:  

        pause: function() {  

            this.stop();  

        },  

        resume: function() {  

            this.start();  

        },  


6.countdown插件,本身只做时间的处理,并没做任何时间的默认展示,需要我们自己来做。  

    我们需要做的就是:  

        1.调用countdown(),传递一个 '终止时间'   

        2.绑定countdown相关事件,在事件内,进行我们的展示处理:  

            上面讲了事件的相关内容:  

1>3个事件方法:  

                    update.countdown  

                    finish.countdown  

                    stoped.countdown  

2>每个事件的额外属性:  

event.finalDate = this.finalDate;           // 设定的终止时间  

event.elapsed = this.elapsed;               // 是否已经过期  

event.offset = $.extend({}, this.offset);   // 当前时间,在各个时间刻度上的计算  

event.strftime = strftime(this.offset);     // 格式化时间函数  

    示例:  

        $('#countdown').countdown("2017/5/1")  

        .on('update.countdown', function(){  

format = "还剩%D天, %H时, %M分, %S秒开始抽奖";            // 指定格式字符串  

            $(this).html(event.strftime(format));               // 将格式字符串,传递给 'event.strftime()' 解析  

        })  

        .on('finish.countdown', function(){  

            $(this).html('开始抽奖');  

        });  



转载自: https://blog.csdn.net/beyond__devil/article/details/70504654

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容