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 ...
随机推荐
- jQuary总结3: jQuery语法1
1.jQuery样式操作 1.1 设置或者修改样式,操作的是style属性. 单样式语法: jQuery对象.css('属性名', '属性值') //html <div id="box ...
- SSH2免密码登录OpenSSH
OpenSSH免密码登录SSH2http://blog.csdn.net/aquester/article/details/23836245 两个SSH2间免密码登录http://blog.csdn. ...
- java程序员修炼之前笔记(前半部分)
第一部分 用java7做开发 第一章 初始java7 java7中的新特性 switch支持String 支持100_000_000数值表示法 新的异常处理 | 连接多个异常 final Except ...
- 设计模式17:Iterator 迭代器模式(行为型模式)
Iterator 迭代器模式(行为型模式) 动机(Motivation) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透 ...
- CodeForces - 631C ——(思维题)
Each month Blake gets the report containing main economic indicators of the company "Blake Tech ...
- jquery库与其他库冲突的问题解决-jquery.noConflict()
在使用jQuery开发的时候,可能还会使用到其他的JS库,比如Prototype,但多库共存时可能会发生冲突:若是发生冲突后,可以通过以下几种方案进行解决: 一. jQuery库在其他库之前导入,直接 ...
- selenium三大浏览器driver下载地址
Chrome 点击下载chrome的webdriver: http://chromedriver.storage.googleapis.com/index.html 不同的Chrome的版本对应的ch ...
- typescript多维对象数组仿List泛型
定义对象: namespace entity{ export class MyClass{ public value:number; public rect:string; public constr ...
- Nagios+InfluxDB+Grafana
1. 概述 Nagios负责收集数据,是一款开源的免费网络监视工具. influxDB负责存储数据,是一个开源的时间序列数据库.比较适合存储监控或者部署记录这些时序数据. Grafana负责数据的图形 ...
- 三,Smarty模板技术/引擎——变量操作(2)
1, 变量的分类 ① 从PHP中分配的变量,比如a.php跳转到b.php时候,可以在a.php中分配变量,b.tpl中直接调用.a.php中代码,$smarty->assign(‘str’,’ ...