javascript计时器编写过程与实现方法


Posted in Javascript onFebruary 29, 2016

JavaScript是一门非常容易上手的脚本语言,而且工具繁多,功能强大,因为一直做后端的关系,笔者目前也只是略学一点皮毛。

接下来进入正题——计时器。先谈下计时器的功能:

1.计时器要能够在页面上显示时间

2.每秒钟计时器刷新,秒每满60进分钟1,分钟每满60进小时1

3.计时器需要能够重置,也就是重新计时

4.计时结束时,需要能够有获取计时时间的方法

以上功能很简单,计时还应该有暂停、继续计时等功能,没关系,我们一个一个来。

第一步:

我们做一个简单的页面,要有一个现实时间的标签,要有开始、暂停俩按钮,页面绘制如下:

javascript计时器编写过程与实现方法

不要为一个页面花太多时间哦,这只是帮助你写写第一段代码练练手~

 第二步:

我们分析下计时器需要哪些属性:

1.计时,需要开始时间

2.结束时间

3.总共走了多长时间,这个属性是要返回给使用者的

4.展示器,其实就是个jquery对象或者dom对象啦,计时是要在一个地方展示的嘛

5.展示时间需要进行拆解,于是我们有小时属性

6.分钟属性

7.秒属性(其实被总时间囊括了,先记上,万一用得到呢)

我们看下代码:

var startTime;//开始时间
    var endTime;//结束时间
    var timeLength;//总时长
    var timeSpan;//计时器走过的时间
    var displayer;//时间显示器
    var hh=0;//小时
    var mm=0;//分钟
    var status=0;//计时状态

乍一看好像多了几个属性,因为计时会用到JavaScript的setTimeout方法,该方法会返回一个对象,我们可以利用此对象将setTimeout清除(clearTimeout);

 第三步:

我们分析下计时器需要哪些方法:

1.计时器需要启动,于是我们有开始方法

2.计时器需要停止,于是我们有停止方法,停止后应该告诉使用者计了多长时间,于是应该返回时长

3.计时器还应该有个暂停功能,暂停后,可以在暂停的位置上再次开始计时,暂停也应该返回时长

4.围绕启动停止,还应该有每秒钟计时器的内心活动,类似一个委托方法,美秒执行一次

5.呈现逻辑,我们要讲真正的时间显示给页面上的展示器,并且做一些可读性更好的格式转换

 上代码,构造函数:

function createTimer(_startTime,_endTime,_timeLength,_displayer){
      startTime=_startTime;//开始时间
      endTime=_endTime;//结束时间
      timeLength=_timeLength;//总时长
      displayer=_displayer;//时间显示器
      hh=0;//小时
      mm=0;//分钟
      status=0;//计时状态
    }

计时器开始:

var start =function(){
      hh = 0;
      mm = 0;
      startTime=new Date();
      status = setTimeout(beat, 1000);
    }

 计时结束:

var stop=function(){
      clearTimeout(status);
      endTime=new Date();
      timeLength=parseInt((endTime-startTime)/1000);
      alert(timeLength);
    }

每秒钟计时器的内心活动:

var beat=function(){
      endTime = new Date();
      timeSpan = parseInt((endTime - startTime)/1000);
      displayer[0].innerHTML = checkTime(timeSpan);
      status = setTimeout(beat, 1000);
    }

为了能够展现上图的00:00:00,我们需要一段呈现逻辑

var checkTime=function(len){
      len=len-mm*60;
      if (len >= 60) {
        this.mm++;
        //starttime1 = new Date();
        len = 0;
      }
      mm=mm-hh*60;
      if (mm >= 60) {
        hh++;
        mm = 0;
      }
      return j(self.hh) + ":" +j(mm) + ":" + j(len);
    }
  
    var j=function(arg){
      return arg >= 10 ? arg : "0" + arg;
    }

我们启动计时器,这个简单的计时器就开始跑了^_^

javascript计时器编写过程与实现方法

是不是少了点什么:计时器哪能没有暂停呀,笔者那会构思这些的时候,也没想到暂停功能,正看着它一秒一秒跳动着,傻乐呢,直到业务需要,才想起来,得加上这功能。

没关系,我们继续设计,demo页上添加一个暂停按钮:P

javascript计时器编写过程与实现方法

先分析下:

1.暂停后,肯定要在上次暂停的节点上重新开始,这块功能我们做在开始按钮里,于是我们需要一个标识位,来判断是重新开始,还是暂停后开始

2.我们需要记录暂停的时间点

3.暂停的时间间隔最好也能记下来,能用得到,不然再次开始的时候,时间在呈现上会立刻跳到间隔之后(比如暂停时是00:00:09,暂停一分钟后,如果不作调整直接开始,时间会变成00:01:09)

于是我们添加三个属性:

var isParse=false;//是否为暂停
    var parseTime;//暂停时间点
    var intervalTime = 0;//暂停时间间隔

暂停方法:

var parse=function(){
      parseTime = new Date();
      isParse = true;
      clearTimeout(status);
    }

重写开始方法和呈现方法:

var start =function(){
      if(!isParse){
        startTime=new Date();
        startTime1=startTime;
        hh = 0;
        mm = 0;
        startTime=new Date();
        status = setTimeout(beat, 1000);
      }
      else{
        intervalTime=parseInt((intervalTime + (new Date() - parseTime) / 1000));
        
        starttime1 = startTime;
        status = setTimeout(beat, 1000);
      }
    }

    var checkTime=function(len){
      len=len-mm*60-intervalTime;
      if (len >= 60) {
        mm++;
        len = 0;
      }
      
      mm=mm-hh*60;
      if (mm >= 60) {
        hh++;
        mm = 0;
      }
      return j(hh) + ":" +j(mm) + ":" + j(len);
    }

以上,搞定,我们的计时器拥有了暂停功能~

 javascript计时器编写过程与实现方法

看下代码全览,核心代码不到一百行。

javascript计时器编写过程与实现方法

 写到这里,主要工作就做完啦,其实还可以进行封装,利用prototype,将方法全部附到一个对象里,当实例化一个timer对象并初始化一些关键属性后,这些方法都可以被对象调用。这里就不赘述了,感兴趣的童鞋可以试试~

Javascript 相关文章推荐
javascript while语句和do while语句的区别分析
Dec 08 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
angularjs中回车键触发某一事件的方法
Apr 24 Javascript
如何在vue里添加好看的lottie动画
Aug 02 Javascript
js实现点击展开隐藏效果(实例代码)
Sep 28 Javascript
图片文字识别(OCR)插件Ocrad.js教程
Nov 26 Javascript
node.js中express模块创建服务器和http模块客户端发请求
Mar 06 Javascript
ES6入门教程之let、const的使用方法
Apr 13 Javascript
原生JS实现萤火虫效果
Mar 07 Javascript
0基础学习前端开发的一些建议
Jul 14 Javascript
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
javascript插件开发的一些感想和心得
Feb 28 #Javascript
详解Javascript中的Object对象
Feb 28 #Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
Feb 28 #Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
Feb 27 #Javascript
Javascript技术栈中的四种依赖注入小结
Feb 27 #Javascript
javascript的 {} 语句块详解
Feb 27 #Javascript
javascript中eval解析JSON字符串
Feb 27 #Javascript
You might like
php开发文档 会员收费1期
2012/08/14 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
新鲜出炉的js tips提示效果
2011/04/03 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
浅谈Vue 初始化性能优化
2017/08/31 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
Python文件去除注释的方法
2015/05/25 Python
python获得一个月有多少天的方法
2015/06/04 Python
Python构建XML树结构的方法示例
2017/06/30 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
python的unittest测试类代码实例
2017/12/07 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
浅谈DataFrame和SparkSql取值误区
2018/06/09 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
Mankind西班牙男士护肤品网站:购买皮肤护理、护发和剃须
2017/04/27 全球购物
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
医学生自我鉴定范文
2014/03/26 职场文书
python批量创建变量并赋值操作
2021/06/03 Python
Python的property属性详细讲解
2022/04/11 Python