移动Web与js定时器暂停或不准确计时的问题解决

PC 上的 Firefox、Chrome 和 Safari 等浏览器,都会自动把未激活页面中的 JavaScript
定时器(setTimeout、setInterval)间隔最小值改为 1 秒以上;而移动设备上的浏览器往往会直接冻结未激活页面上的所有定时器」。今天继续聊一聊
JavaScript 定时器与移动 Web 这个话题。

计时器

最简单的计时器只需要一个时间变量和固定间隔运行的函数就可以了,定期把上一次时间(默认为系统初始时间)加上运行间隔就是当前时间了。在 PC
上,这样实现的计时器只要运行间隔没有小于 1s,多半没什么大问题。但移动端不一样,只要页面不在前台显示,计时器就彻底不走了。

这个问题很容易解决,只要把定时器函数里的时间累加逻辑,换成每次都从系统时间获取就可以了。那如果系统时间不准怎么办?实际上大部分智能手机,默认都会开启网络校时,而且很多人有拿手机当手表的习惯,所以移动
Web 里获取到的系统时间,相比 PC 端,要准确得多。

更严谨的做法是服务端输出页面时带上服务器时间,JS 计时器先算出这个时间与系统时间之差 Δt,之后每次都用当前系统时间 + Δt
来还原服务器时间。逻辑很简单不多介绍了,说两个问题:

1)如果定时器运行时,用户改了系统时间怎么办?这个问题有很多解决方案,但是在移动设备上却有个偷懒的办法,由于移动设备上修改系统时间几乎一定会让页面进入后台,所以我们只需要在页面「从后台切回」时刷新下页面就好了。

2)移动设备在 2G 等网络环境下,接收响应需要更长时间,很有可能 JS
从页面上拿到服务器时间,已经是几十秒之后的事情了,丧失了准确性。如果一定要解决这个问题,使用 HTML5 新增的 Navigation
Timing API
 来修正是一种思路。美中不足的是 Android 4.0+ 才支持,Safari 系列则从未支持过这个 API。

从后台切回

要判断移动端页面是否从后台切回有很多方案,但利用后台页面定时器被冻结这个特性,有个简便且通用的做法:


var lastTime = +new Date;
setInterval(function() {
if(Math.abs(+new Date - lastTime) > 3000) {
alert(‘从后台切回!‘);
}
lastTime = +new Date;
}, 1000);

原理很简单,每隔一段时间(如 1s)更新页面上某个变量,如果下次这个变量与当前系统时间之差大于某个阈值(如
3s),说明页面定时器肯定被冻结过,也就是说页面是从后台切回来。代码中加上 Math.abs
是因为用户可能把系统时间往回改(当然极端情况下还是会检测不出来,忽略就好了)。

另一种定时器

「不会被 iOS 停掉的网页定时器」,原理是利用不会被 iOS 冻结的<meta> 标签 refresh
功能模拟 JS 定时器,有兴趣的同学可以点这里了解下。

本文链接:https://www.imququ.com/post/mobile_web_and_js_timer.html

此文转载自:JerryQu 的小站

时间: 2024-10-04 12:30:34

移动Web与js定时器暂停或不准确计时的问题解决的相关文章

移动 Web 与 JavaScript 定时器

转载自:https://www.imququ.com/post/mobile_web_and_js_timer.html 在之前博客中,我曾经写过「PC 上的 Firefox.Chrome 和 Safari 等浏览器,都会自动把未激活页面中的 JavaScript 定时器(setTimeout.setInterval)间隔最小值改为 1 秒以上:而移动设备上的浏览器往往会直接冻结未激活页面上的所有定时器」.今天继续聊一聊 JavaScript 定时器与移动 Web 这个话题. 计时器 最简单的计

js 定时器用法详解——setTimeout()、setInterval()、clearTimeout()、clearInterval()

  在js应用中,定时器的作用就是可以设定当到达一个时间来执行一个函数,或者每隔几秒重复执行某段函数.这里面涉及到了三个函数方法:setInterval().setTimeout().clearInterval(),本文将围绕这三种函数的用法,来实现定时器的功能,需要的朋友可以过来参考下,喜欢的可以点波赞,或者关注一下本人,希望对大家有所帮助. 定时器的应用需求: 1.设定一个时间,当时间到达的时候执行函数----比如:倒计时跳转页面等等. 2.每隔一段时间重复执行某段函数----比如抢票软件,

C#-WebForm JS定时器(转)

C#-WebForm JS定时器 JS定时器: 1.window.setTimeout(function(){},3000) 延迟3秒执行 2.window.setInterval(function(){},3000) 也叫重复器,每3秒重复相同的事件 关闭定时器: var timer = window.setTimeout(function(){ window.clearTimeout("timer"); },3000); var timer = window.setInterval

C#-WebForm JS定时器

JS定时器: 1.window.setTimeout(function(){},3000) 延迟3秒执行 2.window.setInterval(function(){},3000) 也叫重复器,每3秒重复相同的事件 关闭定时器: var timer = window.setTimeout(function(){ window.clearTimeout("timer"); },3000); var timer = window.setInterval(function(){ wind

atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js

atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js 1. 图片按钮的效果总结 1 1.1. 按钮图片自动缩放的. 1 1.2. 不要边框,如果用自定义图片做按钮背景可以设为 false. 2 1.3. 异形按钮 2 1.4. 不绘制焦点 2 1.5. 鼠标经过时的图标 2 1.6. 选中时的图标 2 1.7. 禁用时显示的图标 2 1.8. 可能需要按钮半透明效果 2 2. 图片按钮的实现 2 2.1. 优先模式:button控

js定时器的使用(实例讲解)

js定时器的使用(实例讲解) 作者: 字体:[增加 减小] 类型:转载 时间:2014-01-06我要评论 本篇文章主要介绍了js中定时器的使用方法.需要的朋友可以过来参考下,希望对大家有所帮助 在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定时器:timename=setInterval("function();",delaytime

定时器暂停以及完全删除

1 var SchedulerPauseResumeTest = cc.Layer.extend({ 2 ctor : function(){ 3 this._super(); 4 //添加监听 5 6 this.schedule(this.onTick1, 0.5); 7 this.schedule(this.onTick2, 0.5); 8 this.schedule(this.onPause, 3); 9 }, 10 onTick1:function (dt) { 11 logTest("

大数据技术之_18_大数据离线平台_02_Nginx+Mysql+数据收集+Web 工程 JS/JAVA SDK 讲解+Flume 故障后-如何手动上传 Nginx 日志文件至 HDFS 上

十一.Nginx11.1.介绍11.2.常见其他 Web 服务器11.3.版本11.4.Nginx 安装11.5.目录结构11.6.操作命令十二.Mysql12.1.介绍12.2.关系型数据库(SQL)种类12.3.特征12.4.术语12.4.与非关系型数据库比较(Not Only SQL)12.4.1.种类12.4.2.特征12.4.3.总结十三.数据收集13.1.收集方式13.2.数据的事件类型13.2.1.Launch 事件13.2.2.PageView 事件13.3.Nginx 日志收集

JS 定时器的4种写法及介绍

JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下setTiemout.setInterval.setImmediate.requestAnimationFrame. 一.什么是定时器 JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下 setTimeout: 设置一个定时器,在定时器到期后执行一次函数或代码段 var timeoutId = window.setTimeout(func[, delay, param1, param2, ...]); var