一个IOS系统定时APP,功能与系统定时器一致

Posted rencoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个IOS系统定时APP,功能与系统定时器一致相关的知识,希望对你有一定的参考价值。

将页面分为时间显示部分,控制部分,显示计次共三个部分。实现的功能有:启动定时器,计次,停止,复位。

计算:当前显示的时间 = 当前计次的累积时间 + 已经结束的所有计次的累积时间和;

关于 new Date().getTime() 实现,google准确,Firefox 误差很大;

涉及到的时间计算,都是用 setInterval实现,没有用 new Date();

尝试过setInterval 与 new Date两者混用,一是误差很大,二是逻辑不够强;

经测试在google浏览器和ios原组件的误差很小(毫秒级别),准确度可靠;Firefox 误差很大;

  1class Stopwatch {
2    constructor(id) {
3        this.container = document.getElementById(id);
4        this.display = this.container.querySelector(\'.display\');   // 时间显示
5        this.lap = this.container.querySelector(\'.lap\');           // 计次显示
6
7        // 计数相关变量
8        this._stopwathchTimer = null;                              // 计时器
9        this._count = 0;                                           // 计次的次数
10        this._timeAccumulation = 0;                                // 累积时长
11        this._timeAccumulationContainer = [];                      // 存放已经结束的计次的容器
12        this._s = 0;                                               // 已经结束的所有计次累积时间
13        this._stopwatchHandlers = [];                              // 用于tartTimer里回调的函数
14
15        // 控制流
16        this.ctrl = this.container.querySelector(\'.ctrl\');         // 控制部分
17        if(this.ctrl) {
18            let btns = this.ctrl.querySelectorAll(\'button\');
19            let startStopBtn = btns[1];                            // 开始和暂停按钮
20            let lapResetBtn = btns[0];                             // 计次和复位按钮
21
22            // 样式更改
23            let changeStyle = {                                   
24                clickStart : function(){
25                    lapResetBtn.disabled = \'\';                     // 计次按钮生效
26                    startStopBtn.innerhtml = \'停止\';
27                    startStopBtn.className = \'stop\';
28                    lapResetBtn.innerHTML = \'计次\';
29                    lapResetBtn.className = \'active\';
30                },
31                clickStop : function() {
32                    startStopBtn.innerHTML = \'启动\';
33                    startStopBtn.className = \'start\';
34                    lapResetBtn.innerHTML = \'复位\';
35                },
36                clickReset : function() {
37                    lapResetBtn.disabled = \'disabled\';             // 计次按钮失效
38                    lapResetBtn.innerHTML = \'计次\';
39                    lapResetBtn.className = \'\';
40                    this.display.innerHTML = \'00:00.00\';
41                    this.lap.innerHTML = \'\'
42                }
43            };
44
45            // 事件处理函数
46            let eventHandler = {
47                start: function() {
48                    lapResetBtn.removeEventListener(\'click\', resetBind);            // 移除复位事件;选择启动,就移除复位
49                    console.log(\'启动\');
50                    changeStyle.clickStart.call(this);                              // 改变按钮显示样式
51                    if(this._count === 0) {                                         // 如果首次启动计时器,增加一条计次    
52                        this._count = 1
53                        // console.log(\'开始事件中的计数次\', this._count)
54                        this.insertLap();                                           // 插入计次 
55                    }       
56                    this.startTimer();   
57                    startStopBtn.removeEventListener (\'click\', startBind);          // 移除启动计时事件
58                    lapResetBtn.addEventListener(\'click\', lapfBind)                 // 添加计次事件                                                   
59                    startStopBtn.addEventListener(\'click\', stopBind)                // 添加停止计时事件
60                },
61
62                stop: function() {
63                    console.log(\'停止\'); 
64                    changeStyle.clickStop.call(this);                               // 改变按钮显示样式
65                    this.stopTimer();                                               // 停止计时;
66                    startStopBtn.removeEventListener(\'click\', stopBind)             // 移除停止计时事件
67                    startStopBtn.addEventListener(\'click\', startBind);              // 重新添加启动计时事件
68                    lapResetBtn.removeEventListener(\'click\', lapfBind);             // 移除计次事件;
69                    lapResetBtn.addEventListener(\'click\', resetBind);               // 添加复位事件
70                },
71
72                lapf: function() {                                                       
73                    this.insertLap();                                               // 插入新计次
74                    this._timeAccumulationContainer.push(this._timeAccumulation);   // 将当前结束的计次推入容器,保存起来
75                    this._s += this._timeAccumulationContainer[this._count - 1];    // 累加已经结束的所有计次
76                    console.log(\'计次\'\'当前累积的计次时间\'this._s);
77                    this._timeAccumulation = 0;                                     // 计时器清零,这条放在求和后面!
78                    this._count++;                                            
79                },
80
81                reset: function() {                                                 // 复位事件
82                    console.log(\'复位\');
83                    changeStyle.clickReset.call(this);                              // 改变按钮显示
84                    // 重置
85                    this._stopwathchTimer = null;                            
86                    this._count = 0;                                          
87                    this._timeAccumulation = 0;                              
如何让iOS设备上App定时执行后台任务(上)

rontab踩坑:crontab定时任务调度机制与系统时间/时区的不一致

iOS中的定时器

C未从定时器接收到信号

如何让iOS设备上App定时执行后台任务(下)

如何让iOS设备上App定时执行后台任务(下)