Skip to content

如何解决倒计时不准确的问题?

问题背景

为什么会出现倒计时不准确的问题?原因如下:

  • 浏览器默认定时器精度。setTimeout 和 setInterval 函数并不能保证时间间隔十分精确,特别是在系统负载较高的时候
  • 页面失去焦点或者被隐藏的时候,比如切换标签页,有些浏览器可能会降低定时器的频率来节省资源,从而提高性能。

例如:

两个倒计时同时开始,然后立刻结束,但是你如果打印结束时间,会至少相差4毫秒左右,这是浏览器的默认精度问题。

解决方法

调整倒计时逻辑(最优)

一开始从服务器直接获取倒计时结束的时间戳,然后就可以根据结束地时间搓和当前时间搓取差值然后取秒(基本上是除以1000),从而得到倒计时的实际秒数。

更新页面的话就是可以利用setInterval或者requestAnimationFrame去更新页面显示的剩余秒数。相对来说更加准确和稳定。

监听页面可见性

当页面失去焦点或者浏览器被最小化,切换标签页的时候去重新到服务器获取时间然后更新页面倒计时。严格来说,准确性也不是非常高。具体地就是可以监听 visibilitychange事件。

js
document.addEventListener('visibilitychange', function () { })

实时获取服务器时间

使用 sse 或者 websocket 获取服务器时间,然后更新页面倒计时。需要服务器支持,然后呢,在客户端使用sse获取服务器时间,然后更新页面倒计时。可能会有点占用服务器资源,精确度相对来说会高一些。但是也是会有网络延时的,可以使用网络延时补偿来提高精度,例如加上往返时间的一半等等吧。

总结

Released under the ISC License.