Angular2实现的秒表及改良版示例


Posted in Javascript onMay 10, 2019

本文实例讲述了Angular2实现的秒表及改良版。分享给大家供大家参考,具体如下:

初版

代码:

export class Watches {
  id: number;
  str: string;
}
export let watcheList: Watches[] = [{
  id: 0, str: '123456'
}, {
  id: 1, str: '564822'
}]
//watchList 是一个静态类
watchList = watcheList;
watchStr: string;
//判断是否是第一次点击startWatch
num: number = 0;
//分 秒 毫秒
minute: number = 0;
second: number = 0;
millisecond: number = 0;
//临时变量 存储计次时的时间,后加入watcheList数组
temp= {
 id: 0,
 str: '0'
};
//定时器的名字
inter: any;
constructor() { }
 resetWatch() {
   //清零
  this.millisecond = 0;
  this.second = 0;
  this.minute = 0;
  this.temp.str = '000000';
  watcheList.length = 0;
 }
timer() {
  //每隔43ms,调用该函数,所以增加43
 this.millisecond = this.millisecond + 43;
 if (this.millisecond >= 1000) {
  this.millisecond = 0;
  this.second = this.second + 1;
 }
 if (this.second >= 60) {
  this.second = 0;
  this.minute = this.minute + 1;
 }
//当小于10是,在前面加一个0,形式则变为00:00:00
 this.watchStr = (this.minute > 10 ? this.minute : '0' + this.minute) + ':'
  + (this.second > 10 ? this.second : '0' + this.second) + ':'
  + (this.millisecond > 10 ? this.millisecond : '0' + this.millisecond);
}
 startWatch(event) {
  this.num = this.num + 1;
  if (this.num > 1) {
   //该状态应该为计次
   temp.id = this.watchList.length;
   temp.str = this.watchStr;
   this.watchList.push(temp);
  } else {
   this.inter = setInterval(() => {
    this.timer();
   }, 43);
  }
 }
 stopWatch(event) {
  this.num = 0;
  if (this.inter) {
   clearInterval(this.inter);
  }
 }
}

原理:

在计时器timer函数里面,定义了一个变量毫秒millisecond,每隔43ms调用timer函数,所以millisecond每次增加43,而后1000ms之后seond增加1,60s之后,minute增加1.

缺点:

函数的运行时间不可控,所以毫秒的增加不准确。

改良版

代码:

// 秒表
export class Watches {
  id: number;
  value: number;
}
export let watcheList: Watches[] = []
export class StopwatchComponent {
 //导入的静态类
 watchList = watcheList;
 //临时变量,用来存贮计次时的时间
 temp: number;
 //判断startWatch是第一次开始,还是计次
 num: number = 0;
 //开始时间
 startTime: number;
 //当前时间
 nowTime: number;
 //时间差
 timerRunner: number = 0;
 //interval函数的名称
 inter: any;
 constructor() { }
 resetWatch() {
  //清零
  this.timerRunner = 0;
  this.watchList.length = 0;
 }
 startWatch(event) {
  this.temp = this.timerRunner;
  //开始计时的时间
  this.startTime = Date.now();
  this.num = this.num + 1;
  if (this.num > 1) {
   //当前状态为计时,将计时的数据加入进watchList
   let watchObj: Watches = {
    id: 0,
    value: 0
   }
   watchObj.id = this.watchList.length;
   watchObj.value = this.timerRunner;
   this.watchList.push(watchObj);
  } else {
   this.inter = setInterval(() => {
    this.nowTime = Date.now();
    this.timerRunner = this.temp + this.nowTime - this.startTime;
   }, 43);
  }
 }
 stopWatch(event) {
  this.num = 0;
  if (this.inter) {
   clearInterval(this.inter);
  }
 }
}

原理:当第一次点击startWatch时,获取当前时间作为开始时间,并每43ms触发定时器,获取最新时间。时间差则为最新时间减去开始时间

Javascript 相关文章推荐
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
Apr 20 Javascript
IE 缓存策略的BUG的解决方法
Jul 21 Javascript
IE8 中使用加速器(Activities)
May 14 Javascript
图解Sublime Text3使用技巧
Dec 21 Javascript
jQuery模拟select实现下拉菜单功能
Jun 20 Javascript
详解Weex基于Vue2.0开发模板搭建
Mar 20 Javascript
详解React 16 中的异常处理
Jul 28 Javascript
微信小程序实现图片上传、删除和预览功能的方法
Dec 18 Javascript
深入浅析js原型链和vue构造函数
Oct 25 Javascript
原生JS实现手动轮播图效果实例代码
Nov 22 Javascript
小程序从手动埋点到自动埋点的实现方法
Jan 24 Javascript
微信js-sdk 录音功能的示例代码
Nov 01 Javascript
node中IO以及定时器优先级详解
May 10 #Javascript
使用Node.js写一个代码生成器的方法步骤
May 10 #Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
May 10 #jQuery
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 #Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
May 09 #Javascript
微信小程序中显示倒计时代码实例
May 09 #Javascript
微信小程序日历弹窗选择器代码实例
May 09 #Javascript
You might like
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
php构造函数的继承方法
2015/02/09 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
Python设计模式之观察者模式简单示例
2018/01/10 Python
wxpython实现图书管理系统
2018/03/12 Python
深入理解Django的中间件middleware
2018/03/14 Python
python 常用的基础函数
2018/07/10 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
数据库的约束含义
2012/09/09 面试题
超市采购员岗位职责
2014/02/01 职场文书
质量承诺书怎么写
2014/05/24 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
基层党建工作简报
2015/07/21 职场文书
MySQL创建管理KEY分区
2022/04/13 MySQL
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS