今天开发了一个手机端的倒计时,然后同事说出现了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在手机熄屏后倒计时会出现延迟情况的更多相关文章

  1. 手机锁屏js倒计时停止问题解决办法探索

    如图,有这么个需求,测试人员在测试过程中提了一个bug,手机锁屏再唤醒倒计时时间没有更新,仍从锁屏的时间继续,于是开始寻找解决之法 经了解得知,锁屏时候,浏览器的一切活动会停止运行,那么js也无法幸免 ...

  2. MSM8909的触摸屏驱动导致的熄屏后重新亮屏速度慢的原因!【转】

    转自:https://blog.csdn.net/kk20000/article/details/83041081 使用的汇顶的触摸驱动的时候会重新亮屏速度慢3秒,而在使用另外一个敦泰触摸驱动的时候没 ...

  3. HTML5学习总结-09 拖放和手机触屏事件

    一 拖放 拖放(Drag 和 drop)是 HTML5 标准的组成部分.拖放是一种常见的特性,即抓取对象以后拖到另一个位置.在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 课程参考 ht ...

  4. 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 如果是,使用原装充电器或使用弱电流方式充电(例如使用电脑USB接口充电)充电15-30分钟后尝试重新开机;注意:电量过低引起的无法开机,刚插入充电器时可能不亮屏但呼吸灯闪烁状态。

    https://www.mi.com/service/support/startup 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 技术支持 如何刷机 无法开机 手机自动关机.重启 ...

  5. HTML5开发手机项目—个人总结

    让网页的宽度自适应屏幕<meta name="viewport" content="width=device-width"/>   1)html上加 ...

  6. HTML5开发手机项目-个人总结(转)

    让网页的宽度自适应屏幕<meta name="viewport" content="width=device-width"/>    1)html上 ...

  7. HTML5轻松实现全屏视频背景

    想在你的网页首页中全屏播放一段视频吗?而这段视频是作为网页的背景,不影响网页内容的正常浏览.那么我告诉你有一款Javascript库正合你意,它就是Bideo.js. 参考网址: https://ww ...

  8. Android中手机录屏并转换GIF的两种方式

    之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...

  9. HTML5开发手机应用--viewport的作用

    在用HTML5开发手机应用或手机网页时,<head>部分总会有如下一段代码,这段代码到底什么意思呢.在网上,大家会得到很多答案.我从网上搜集了部分介绍,整理一下,以留备用. <met ...

随机推荐

  1. Boost学习之语法解析器--Spirit

    Boost.Spirit能使我们轻松地编写出一个简单脚本的语法解析器,它巧妙利用了元编程并重载了大量的C++操作符使得我们能够在C++里直接使用类似EBNF的语法构造出一个完整的语法解析器(同时也把C ...

  2. Java中一对多映射关系

    通过栗子,一个人可以有多辆汽车 定义人   这个类 人可以有很多辆汽车,类中车属性用数组 class Person{ private String name; private String phone ...

  3. 说一下自己对于 Linux 哲学的理解

    查阅了一些资料,官方的哲学思想貌似是: 一切皆文件 由众多单一目的的小程序,一个程序只实现一个功能,多个程序组合完成复杂任务 文本文件保存配置信息 尽量避免与用户交互 什么,你问我的理解?哲学思想?E ...

  4. CodeSmith Generator 6.5 自动生成后的源码分析

    1,NetTiers代码结构流程分析: 2,CodeSmithNetTiers使用实践总结 参看流程结构图和实体定义文件关系图,可以看出自动代码生成后,若是手工来调,还是很麻烦的.鉴于此,建议:1,若 ...

  5. spring boot 整合 HttpClient

    第一步:引入HttpClient 的jar包 1.httpClient 5.0 开始支持异步(Async)请求: 2.httpclient 版本过低上传文件会出,原因是 org.apache.http ...

  6. docker中安装Jenkins

    1.获取Jenkins镜像(不要直接docker pull jenkin,这样获取的不是最新的版本,后续安装部分插件会不成功) docker pull jenkins/jenkins 创建文件夹 su ...

  7. webservice 创建及调用

    1.创建一个空白项目 2.在此项目上新建项--添加一个web服务 (.asmx) 这样就创建好了一个webservice --------------------------------------- ...

  8. Python【变量】

    本文介绍 1.Python运算符 运算符分类 运算符分为:算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算 一.算数运算:返回数字 假设变量a=10,b=20 运算符: + 相加a+ ...

  9. Access MongoDB Data with Entity Framework 6

    This article shows how to access MongoDB data using an Entity Framework code-first approach. Entity ...

  10. UIView之setNeedsDisplay与drawRect 和 setNeedsLayout与layoutSubViews

    1.UIView的setNeedsDisplay和setNeedsLayout方法 首先两个方法都是异步执行的.而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到  UI ...