html5在手机熄屏后倒计时会出现延迟情况
今天开发了一个手机端的倒计时,然后同事说出现了Bug,怎么回事呢?Bug很简单,就是在手机返回主界面或者熄屏后倒计时会暂停在熄屏前的时间(注意时间是页面加载时获取的服务器的时间),问题很简单,知道问题所在,百度!在网上查了好多,然后发现一个很神奇的事件:visibilityChange,先在PC端实验,然后发现切换网页再切回来能触发这个事件,好事啊,那是不是移动端也可以这样处理呢,网页切回来或者熄屏后重新打开然后重新获取后台时间不是就OK了吗,说干就干:代码如下:
document.addEventListener('visibilityChange', function() {
if (document.VisibilityState == 'hidden') {
alert("backStage");
} else {
alert("welocme back");
}
}, false);
PC端切换页面能弹出东西,好开心,然而(我想大家都怕好事后面的然而),移动端没反应?What?为啥不行?说好的当文档从可见变为不可见或者从不可见变为可见时,会触发该事件,可是确实没触发,对了可能是兼容问题,这个事件的兼容性贼恶心,捣饬了大段的代码,然后。。。
· 伤心,换个方式,很多大神说调用webSocket,不过感觉好麻烦,放弃,再想办法,程序猿么,天生就是解决问题的,再想办法,然后就有了一下这种方式(当然是以牺牲一点点性能实现的)
逻辑很简单,页面初始化时获取服务器的事件,然后再获取本地时间,然后求出服务器时间和本地时间是的差值,然后再计时器运行时每秒获取一次时间戳,然后加上前面运算的到的差值,也就是说每一秒都获取当前的时间戳然后要通过运算得到目前服务器的时间,下面上代码:
var mulse = "";
var timer = null;
var overTime = new Date("2018/6/18 08:30:00").getTime(); //设置倒计时结束时间 // var now = new Date().getTime(); //获取打开时时间
var now = null;
var serverTime = 1527042000000; //获得服务器时间
now = new Date().getTime(); //获得当前本地时间
var serverTimeMulse = serverTime - now; //获得初始化时间差
timer = setInterval(function() {
now = new Date().getTime() + serverTimeMulse; //获取此刻服务器时间
mulse = overTime - now; //获得结束时间与当前是按的差值
var d = TouDo(Math.floor(mulse / (1000 * 60 * 60 * 24))); //通过运算得到天数
mulse -= d * (1000 * 60 * 60 * 24); //获取剩余的时间用来获取小时数
var h = TouDo(Math.floor(mulse / (1000 * 60 * 60))); //得到小时数
mulse -= h * (1000 * 60 * 60); //获取剩余的时间用来获取分钟数
var min = TouDo(Math.floor(mulse / (1000 * 60))); //得到分钟数
mulse -= min * (1000 * 60); //获取剩余的时间用来获取秒数
var s = TouDo(Math.floor(mulse / 1000)); //得到秒数
});
function TouDo(n) {
return n >= 10 ? "" + n : "0" + n;
}
之后测试,没问题,Bug解除,虽然此种方式顺利解决Bug,但是还是存在如下问题:
1、 性能问题,每秒都获取时间戳会影响页面的性能
2、用户在退出本页面然后修改时间之后再重新打开本页面(注意是未刷新情况),初始化的时间差不能及时更新
各位过路大神有新的见解还望不吝赐教 ^(*_*)^
html5在手机熄屏后倒计时会出现延迟情况的更多相关文章
- 手机锁屏js倒计时停止问题解决办法探索
如图,有这么个需求,测试人员在测试过程中提了一个bug,手机锁屏再唤醒倒计时时间没有更新,仍从锁屏的时间继续,于是开始寻找解决之法 经了解得知,锁屏时候,浏览器的一切活动会停止运行,那么js也无法幸免 ...
- MSM8909的触摸屏驱动导致的熄屏后重新亮屏速度慢的原因!【转】
转自:https://blog.csdn.net/kk20000/article/details/83041081 使用的汇顶的触摸驱动的时候会重新亮屏速度慢3秒,而在使用另外一个敦泰触摸驱动的时候没 ...
- HTML5学习总结-09 拖放和手机触屏事件
一 拖放 拖放(Drag 和 drop)是 HTML5 标准的组成部分.拖放是一种常见的特性,即抓取对象以后拖到另一个位置.在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 课程参考 ht ...
- 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 如果是,使用原装充电器或使用弱电流方式充电(例如使用电脑USB接口充电)充电15-30分钟后尝试重新开机;注意:电量过低引起的无法开机,刚插入充电器时可能不亮屏但呼吸灯闪烁状态。
https://www.mi.com/service/support/startup 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 技术支持 如何刷机 无法开机 手机自动关机.重启 ...
- HTML5开发手机项目—个人总结
让网页的宽度自适应屏幕<meta name="viewport" content="width=device-width"/> 1)html上加 ...
- HTML5开发手机项目-个人总结(转)
让网页的宽度自适应屏幕<meta name="viewport" content="width=device-width"/> 1)html上 ...
- HTML5轻松实现全屏视频背景
想在你的网页首页中全屏播放一段视频吗?而这段视频是作为网页的背景,不影响网页内容的正常浏览.那么我告诉你有一款Javascript库正合你意,它就是Bideo.js. 参考网址: https://ww ...
- Android中手机录屏并转换GIF的两种方式
之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...
- HTML5开发手机应用--viewport的作用
在用HTML5开发手机应用或手机网页时,<head>部分总会有如下一段代码,这段代码到底什么意思呢.在网上,大家会得到很多答案.我从网上搜集了部分介绍,整理一下,以留备用. <met ...
随机推荐
- 关于Markdown格式转PDF格式
Markdown转PDF格式 个人使用的Markdown编辑平台:有道云笔记网页版 当我们编辑好自己的随笔以后,在网页的[客户端下载]下面有一个[更多]的圆形图标选项,点击后在菜单中有一处[打印]选项 ...
- Android-ContentProvider流程
Android-ContentProvider原理及流程 Android为什么设计出一个ContentProvider ? 答:ContentProvider的出现主要是暴露数据出去,暴露什么数据呢 ...
- java-02 JDK安装与环境变量配置&安装编程IDE
1.JDK下载安装与环境变量的配置 1.1 官方JDK 下载地址 大家可以到Oracle中国官方网站下载JDK,也可已 通过这个链接下载 (推荐大家下载1.8版本,这个版本是当前比较流行的版本) 也可 ...
- INDEX--索引页上存放那些数据
由于索引的叶子节点和非叶子节点的作用不同,导致不同类型节点上每行记录存放的数据不同--============================================唯一聚集索引叶子节点:所有 ...
- IO--RAID
RAID IO计算 Raid 0 –每个磁盘的I/O计算= (读+写) /磁盘个数 Raid 1 --每个磁盘的I/O计算= [读+(2*写)]/2 Raid 5 --每个磁盘的I/O计算= [读+( ...
- 查看linux ssh服务信息及运行状态
关于ssh服务端配置有不少文章,例如 linux下ssh服务配置,这里仅列举出一些查看ssh服务相关信息的常用命令. rpm -qa | grep ssh 可以看到系统中ssh安装包 rpm -ql ...
- Sql Server 2012 数据库同步方式 (发布、订阅)
上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数 ...
- C#线程和异步
C#Thread学习 C#ThreadPool学习 C#Task学习 C#backgroundWorker c# 锁的使用 C#前台线程和后台线程区别 C#Async,await异步简单介绍 C#委托 ...
- asp.net core 2.0类库项目读取配置文件
1.首先在类库项目中添加 这3个库. 2.在类库项目中添加AppSetting.cs.代码如下: using Microsoft.Extensions.Configuration;using Syst ...
- jQuery如何追加内容?匿名函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...