受限于js的单线程模式,使用定时器实现倒计时会出现一定程度的时间差,若存在比较耗时的其他任务的话,差值往往是不可接受的,一下分享一种使用setTimeout实现的倒计时效果,思路就是通过引入计数器,判断计时器延迟执行的时间来调整,尽量让误差缩小,不同浏览器不同时间段打开页面倒计时误差可控制在 1s 以内。

以下是代码实现:

// 开始线程占用
window.setInterval(function () {
  var j = 0;
  while(j++ < 100000000);
}, 0);
 
//倒计时
const interval = 1000;
var ms = 50000,  // 倒计时时间差,这里测试用50000ms
  count = 0,
  startTime = new Date().getTime();
  if (ms >= 0) {  
      var timeCounter = window.setTimeout(countDownStart, interval);                  
  }
 
function countDownStart() {
  count++;  
  var offset = new Date().getTime() - (startTime + count * interval);  
  var nextTime = interval - offset;  
  var daytohour = 0;

if (nextTime < 0) {
    nextTime = 0
  };

ms -= interval;  
 
  console.log("误差:" + offset + "ms,距离下一次执行:" + nextTime + "ms后,距离活动开始还有:" + ms + "ms");
 
  if (ms < 0) {    
    window.clearTimeout(timeCounter);
  } else {
    timeCounter = window.setTimeout(countDownStart, nextTime);
  }
}

由于线程阻塞延迟问题,做了 setTimeout 执行时间的误差修正,保证 setTimeout 执行时间一致。若冻结时间特别长的,可以在此基础上扩展处理

前端如何让倒计时更准确相关推荐

  1. 前端显示服务器时间,前端展示活动倒计时使用服务器时间

    获取服务器时间,可以从请求头里去取,也就是这个 具体获取方法是这样的 请原谅我放荡不羁不爱打字,因为我不知道那些大神们是怎么把代码粘进来的 由于服务器获取的是英文时间,所以有八个小时的时差,也就是会比 ...

  2. 前端处理订单倒计时显示问题

    前言 项目中有下图这样一个显示倒计时的需求,需要实现: 一开始想法是需要接口返回 到期时间戳 减去 客户端当前时间 ,然后计算出要显示 倒计时剩余时间 :最后感觉用客户端时间会不准确,可能会出现服务器 ...

  3. 前端 javaScript 新年倒计时

    实现思路: 利用当前时间的毫秒数与新年时间的毫秒数对比实现倒计时 封装了3个相对独立的过滤器配合使用 更换时间可以直接改 平安夜倒计时:const ms2023 = new Date(2023,11, ...

  4. 前端页面实现倒计时效果的几种方法

    倒计时的效果在网站或其他平台剪得很多了吧,今天就让我们来看看实现它的几种方法吧! 一 --15分钟倒计时 <html> <head> <meta charset=&quo ...

  5. 【转】前端验证码倒计时、后台发送验证码、创蓝短信接口

    前端代码:倒计时 <!DOCTYPE html> <html> <head lang="en">     <meta charset=&q ...

  6. 前端验证码倒计时、后台发送验证码、创蓝短信接口

    前端代码:倒计时 <!DOCTYPE html> <html> <head lang="en">     <meta charset=&q ...

  7. html+css+js制作时间倒计时(时分秒)简易版

    效果图展示: 1.先了解获取时间的函数 Date():获取当前系统时间 //获取当前系统时间 var date = new Date(); 2.获取时间的方法 getHours():获取小时值 get ...

  8. VUE倒计时刷新页面不影响

    前端 强制性JS倒计时关闭浏览器(刷新页面也存在)也会存在的倒计时* VUE 倒计时刷新页面也存在 (持续更新) 不多BB 直接上代码 活用 localStorage 机制 (VUE+webpack版 ...

  9. RabbitMQ实现订单超时设计思路、以及在订单过期临界点支付成功如何处理

    场景: 我们知道用 RabbitMQ 的延时队列可以实现用户下单后在 xxx 时间内未支付,需要自动关闭订单.但如果用户在订单即将过期的最后一秒支付成功.那么这笔订单算不算正常下单?要不要释放库存? ...

最新文章

  1. SQLSERVER2012里的扩展事件初尝试(上)
  2. 【整理】SD交货拣配(Picking)处理
  3. MyBatis操作指南-与Spring集成(基于注解)
  4. 算法工程师思维导图—数据结构与算法
  5. 【LeetCode】3月27日打卡-Day12
  6. .NetCore+WebUploader实现大文件分片上传
  7. 腾讯老鸟谈,软件测试的完整流程/过程
  8. proc文件系统、sysfs文件系统、kobject操作
  9. matlab中换行操作
  10. 步进电机结构C语言程序,51单片机驱动步进电机(含电路图和C语言源程序代码)
  11. 独到理解@java数据类型
  12. 如何设计淘宝天猫这种成功而有价值大数据可视化?
  13. 码率/比特率完整介绍
  14. 微信企业号开发源码Java编写,懒人开发一键式部署项目,WeChatEnterprise框架你值得拥有
  15. 【知识兔Excel教程】7个Excel序号填充的经典案例,照搬这些公式,效率倍增
  16. 如何远程登陆Linux服务器
  17. Mac OS开发之icns文件
  18. 腾讯网页登陆的加密机制
  19. epic如何修改着色器缓存路径
  20. 快醒醒吧!你连基础的JVM运行时内存布局都忘了?Java面试题及解析

热门文章

  1. 让IE6支持图片半透明
  2. linux sort
  3. 文件 在线压缩 技术
  4. php操作mysql的封装类_PHP封装的mysqli数据库操作类示例
  5. angularjs html编辑器,AngularJS集成wangeditor富文本编辑器
  6. Java自动拆装箱面试_跟王老师学泛型(二):Java自动装箱与拆箱
  7. flink 6-检查点和水位线
  8. php灰度化,PHP Imagick – 将图像转换为灰度(非常糟糕的结果)
  9. php 输出答案,php 如何只输出最后生成的那个值??
  10. java程序中可以有几个构造方法_java中多个构造方法可以相互引用么?