精准秒表计时器实现---基于js

改秒表具有以下四个功能

  1. 在页面加载出时:开始计时
  2. 格式化显示时间 00:00
  3. 只有在时间更新时才更新视图
  4. 防止多次重复开启定时
javascript 复制代码
page({

 date:{

    timer:null,
    starttime:0,
    gametime:"00:00"
}

    startTimer(){
    if(timer) return;//如果已经开启时间,直接返回避免重复开启
    
    const startTime=Date.now()-this.calcTlapsed();//校准时间:当前秒数-已流逝秒数
    this.Date({ startTime });//保存
    
    const loop=()=>{
        //计算流逝的秒数
        const elasped=Math.floor((Date.now()-this.data.startTime)/1000);
          
       const min=Math.floor(elasped/60);//计算分钟
       const sec=elasped%60;//计算秒钟
       const gameTime=(min<10?"0"+min:min)+":"+(sec<10?"0"+sec:sec);//格式化
        
        if(gameTime!=this.data.gameTime)
        {
            setData({gameTime});//只有时间变化时,才更新视图,减少渲染。
        }
        this.data.timer=setTimeout(loop,1000);//1s启动一次loop函数
  };
         this.data.timer=setTimeout(loop,1000);//首次调用
},
    
    calcElasped(){

        const {startTime}=this.data;
        if(!startTime) return 0;/如果还没有开始计时,返回0
        return Math.floor((Date.now()-startTime)/1000);
    },

    stopTimer()
   {
        if(this.data.timer)
        {
            clearTimeout(this.data.timer);
        }
        this.data.timer=null;
   },

})

这段代码和核心在于如何确定好开始的时间,使用date.now()返回。当事件发生时,调用该函数就会返回当前时间,并把该值存进startTimer变量中。确定好事件发生的时间之后,就要计算事件消耗的时间是多少了。调用Date.now()-startTime获取该事件消耗的时间,这样就可以灵活计算出事件开始的时间了(校准)。

之所以要更新事件开始的时间是因为如果程序切换到后台之后,会导致计时暂停,当再次回到页面之后会发现计的时间明显偏少,所以采用记录事件消耗的时间来推算出开始事件的时间点(校准后),就不会出现时间少记的情况了。

计算公式:总时间-该事件耗时的时间=校准后事件开始的时间。

相关推荐
Chester_19993 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
FreeTinker3 小时前
HTML本地存储技术解析:localStorage与sessionStorage的原理、差异与应用场景
前端·html
qq_452396233 小时前
第十二篇:《全链路监控与可观测性:前端错误追踪与性能分析》
前端
海兰4 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融
EXI-小洲4 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
wangruofeng4 小时前
Phosphor Icons 官网源码拆解:URL 即存储、水波动画与 7362 Star 图标库的架构实践
前端·架构·github
BigTopOne4 小时前
WebRTC Native / Android 开发学习资源整理
前端
会周易的程序员4 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导4 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan4 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt