`

[转] javascript实现在倒计时线程注册多个事件的功能

阅读更多

javascript实现在倒计时线程注册多个事件的功能

 

javascript实现倒计时的功能,相信很多朋友都做过,直接用setInterval不就行了。但是如果一个应用内有很多地方需要使用倒计时的功能,那不封装一下真的就不行了,至少一个应用内只要一个倒计时的线程在跑就OK了。

 

公司最近搞的一个项目,就大量使用了倒计时功能。比如有一个抢购功能,可以先预约,到点后系统就会给出通知,然后就能抢购商品。页面上要实现倒计时的显示,按钮的切换。demo地址:http://www.01happy.com/demo/javascript-countdown/

代码可以在demo里通过查看源码看到,这里说明下javascript代码

1.事件类

//事件类
var EventObject = {
    createNew: function() {
        var eventObject = {};
 
        /**
         * 事件执行时间
         */
        eventObject.excuteTime = 0;
 
        /**
         * 事件执行方法
         * @param {int} timestamp
         * @returns
         */
        eventObject.excute = function(timestamp) {
        };
 
        return eventObject;
    }
};

 我们把要执行的任务理解成一个一个的事件,比如到点切换按钮为立即抢购也可以当成一个事件。每个事件都可以设定执行的事件和执行的方法体。

 

2.倒计时类

/**
 * 倒计时类
 */
var TimeThreading = {
    createNew: function() {
        var timeThreading = {};
        /**
         * setInterval返回ID
         */
        timeThreading.t = {};
        /**
         * 注册要执行的事件
         */
        timeThreading.eventObjects = new Array();
 
        /**
         * 开始执行
         * @returns {undefined}
         */
        timeThreading.start = function() {
            var self = this;
            this.t = setInterval(function() {
                //获取当期时间戳
                var timestamp = Math.ceil((new Date().getTime()) / 1000);
 
                var eventObjects = self.getEventObjects();
                for (var i in eventObjects) {
                    if (!eventObjects[i].excuteTime) {//如果没有设定执行时间,则直接执行事件
                        setTimeout(eventObjects[i].excute(timestamp), 1000);
                    } else {//有设定执行时间,则校验当前时间和事件执行时间是否匹配
                        if (eventObjects[i].excuteTime === timestamp) {
                            setTimeout(eventObjects[i].excute(timestamp), 1000);
 
                            //事件执行后,则移除该事件。这里并没有考虑事件执行成功与否
                            self.removeEvent(i);
                        }
                    }
                }
            }, 1000);
        };
 
        /**
         * 结束执行
         */
        timeThreading.end = function() {
            clearInterval(this.t);
        };
 
        /**
         * 注册事件
         * @param {type} eventObject
         * @returns {TimeThreading}
         */
        timeThreading.registerEvent = function(eventObject) {
            this.eventObjects.push(eventObject);
            return this;
        };
 
        /**
         * 移除事件
         * @param {type} eventObject
         * @returns {TimeThreading}
         */
        timeThreading.removeEvent = function(index) {
            this.getEventObjects().splice(index, 1);
            return this;
        };
 
        /**
         * 获取所有注册的事件
         * @returns {Array}
         */
        timeThreading.getEventObjects = function() {
            return this.eventObjects;
        };
 
        return timeThreading;
    }
};

 单独跑的一个线程,通过start、end方法控制倒计时的运行和停止;通过registerEvent来注册要执行的事件;代码中注释比较详细了,不多做说明,值得一提的是执行每个事件的时候除了直接调用事件的excute的方法,更在外围加了setTimeout。

 

3. 运行示例

//当前时间戳
var timestamp = Math.ceil((new Date().getTime()) / 1000);
 
//实例化倒计时线程
var timeThreading = TimeThreading.createNew();
 
//注册时间戳显示事件
var eventObject = EventObject.createNew();
eventObject.excute = function(timestamp) {
    document.getElementById('show-timestamp').innerHTML = timestamp;
};
timeThreading.registerEvent(eventObject);
 
//注册按钮切换到即将开始事件
var willBeginEvent = EventObject.createNew();
willBeginEvent.excuteTime = timestamp + 5;
willBeginEvent.excute = function() {
    document.getElementById('status-btn').innerHTML = "即将开始";
};
timeThreading.registerEvent(willBeginEvent);
 
//注册按钮切换到立即抢购事件
var snapUpEvent = EventObject.createNew();
var timestamp = Math.ceil((new Date().getTime()) / 1000);
snapUpEvent.excuteTime = timestamp + 10;
snapUpEvent.excute = function() {
    document.getElementById('status-btn').innerHTML = "立即抢购";
};
timeThreading.registerEvent(snapUpEvent);
 
//注册按钮切换到已经结束事件
var endEvent = EventObject.createNew();
endEvent.excuteTime = timestamp + 15;
endEvent.excute = function() {
    document.getElementById('status-btn').innerHTML = "已经结束";
};
timeThreading.registerEvent(endEvent);
 
//开始倒计时
timeThreading.start();

 

小结

自己对javascript研究的并不深透,只是用javascript实现了这样的一个思路:一个应用内只跑一个倒计时线程,而后把要执行的事件注册到该线程上,从而实现较好的代码分离效果。

 

原文链接: http://www.01happy.com/javascript-events-registered-in-the-countdown-thread-function/

 

分享到:
评论

相关推荐

    光棍节倒计时

    在Java中,多线程允许程序执行多个任务同时进行,这里`TimeThread`负责执行倒计时逻辑。每当时间减少一秒,线程会更新`TimeFrame`中的时间显示,并确保倒计时的平滑进行。使用线程是必要的,因为它避免了主线程(GUI...

    HTML华丽倒计时特效(可扩展)

    在这个"HTML华丽倒计时特效"项目中,我们看到HTML5被用来创建一个吸引人的倒计时功能。 在HTML5中,`<canvas>`元素是一个非常重要的部分,它提供了在浏览器中进行2D绘图的能力。在这个倒计时特效中,`canvas`可能被...

    倒计时环形进度条

    倒计时功能的实现包括设置初始时间,实时更新剩余时间,并在到达终点时触发相应的事件。 接下来,我们关注“时间”这一标签。在编程中,时间管理是至关重要的,特别是在实时应用中。处理时间通常涉及到与系统时间的...

    计算机接口实现倒计时器

    综上所述,实现一个计算机接口的倒计时器涉及了时间管理、编程语言应用、用户交互、事件驱动编程、多线程、错误处理等多个方面的知识。通过理解和掌握这些概念,开发者可以创建出高效且用户友好的倒计时应用程序。

    HTML5实现元旦倒计时

    接着,JavaScript是实现倒计时功能的关键。HTML5引入了Web Storage(包括localStorage和sessionStorage)以及Web Workers,这些都可以辅助我们在JavaScript中更高效地处理时间计算。Web Storage用于在本地存储数据,...

    自己设计的倒计时程序

    在IT领域,设计一个倒...总之,设计一个倒计时程序涉及到时间处理、用户交互、线程管理等多个IT知识点,而这款“自己设计的倒计时程序”通过其简单的操作方式和灵活的设置,展示了编程在日常生活中的实用性和便捷性。

    倒计时的源码

    倒计时功能在软件开发中是一项基础且实用的技术,它被广泛应用在各种场景,如定时提醒、考试倒计时、活动倒计时等。对于新手和初学者来说,理解并实现倒计时的源码是提升编程技能的一个好途径。 在编程中,倒计时...

    短信验证button的倒计时

    在本篇中,我们将深入探讨如何实现这样一个倒计时功能,并结合具体的编程实践来阐述相关知识点。 首先,我们需要理解短信验证码的工作流程:当用户点击“获取验证码”按钮时,应用程序会向服务器发送请求,服务器...

    倒计时功能的计时器

    3. **多任务支持**:高级的计时器可能支持同时运行多个倒计时,适用于需要管理多个事件的情况。这需要在编程时考虑如何有效地管理和更新多个计时器状态。 4. **提醒功能**:当倒计时结束时,计时器会触发提醒,这...

    时间倒计时源代码

    3. **线程安全**:如果这个倒计时需要在多个用户之间共享或者在网页中实时更新,那么需要确保它是线程安全的,避免并发访问引发的问题。 4. **UI更新**:在SharePoint环境中,可能需要使用ASP.NET控件或者...

    简单秒表与倒计时代码

    在IT领域,秒表和倒计时功能是常见的编程需求,尤其在游戏、计时器应用、测试工具以及各种实时监控系统中。本主题将详细探讨如何实现这些功能,主要聚焦于软件开发中的计时算法和用户界面设计。 首先,我们要理解...

    倒计时控件

    综上所述,"倒计时控件"项目涵盖的时间处理、定时任务、用户界面设计、线程同步、状态管理、事件监听以及灵活性设计等多个方面,都是开发人员需要掌握的关键技术。文件名"CountDownMaster"可能表示这是倒计时控件的...

    java五分钟倒计时

    虽然上述代码简化了示例,但在实际应用中,如果多个用户同时使用倒计时功能,可能需要考虑线程安全问题。如果`CountdownTask`与数据库或其他共享资源交互,应确保使用同步机制防止数据冲突。 6. **优化改进**: -...

    倒计时器,用C#写的

    倒计时器在多种应用场景中都非常实用,例如网页游戏中的计时功能,帮助用户追踪任务完成或资源可用的时间。C#是一种面向对象的、类型安全的编程语言,广泛用于开发Windows桌面应用、Web应用以及游戏开发等。 首先,...

    2个倒计时和一个秒表计时器demo

    总的来说,这个"2个倒计时和一个秒表计时器demo"涵盖了时间处理、事件驱动编程、用户界面更新以及可能的多线程或异步操作等多个核心编程概念,是学习和实践计时功能的好例子。通过深入研究这个demo,开发者可以更好...

    新年倒计时&元旦倒计时源代码合集

    6. **多线程和并发**:如果倒计时是在多线程环境下运行,例如在更新UI的同时进行计时,就需要理解线程同步和互斥锁等概念,确保数据的一致性和正确性。 7. **错误处理**:任何程序都应考虑异常和错误情况。例如,...

    倒计时防刷新代码

    在开发Web应用,尤其是涉及到倒计时功能的场景,如在线考试系统,防止用户通过刷新页面来重置计时器是非常关键的。"倒计时防刷新代码"是为了确保用户体验的公平性和系统的安全性,避免用户利用刷新页面的手段获得...

    Javascript定时器 一 单线程

    定时器在JavaScript中的应用广泛,如动画效果、轮询服务器、实现延时操作、创建倒计时等。了解它们的工作原理和注意事项,能帮助我们编写出更健壮、高效的代码。 总结,JavaScript定时器在单线程环境下运行,它们...

    miaobiao.rar_倒计数_倒计时秒表

    "miaobiao.rar_倒计时_倒计时秒表"这个压缩包文件显然是一个专注于倒计时功能的程序或者代码库,可能包含了实现这一功能的源代码或者执行文件。让我们深入探讨一下倒计时秒表的核心知识点。 首先,倒计时秒表的基本...

    djs.rar_DJS哪里的时间_djs_倒计时_倒计时器_倒计时计时器

    在技术实现上,DJS倒计时器通常基于编程语言如JavaScript或Python开发,通过计算当前时间与目标时间之间的差值,动态更新界面的显示。对于Web应用,它可能利用浏览器提供的Date对象和定时器API(如setTimeout或...

Global site tag (gtag.js) - Google Analytics