http://www.111cn.net/wy/js-ajax/94218.htm

手机版网页js倒计时存在的问题与解决的方法

www.111cn.net 更新:2015-09-16 编辑:kp12345 来源:转载
js倒计时我们做过很多了但在使用过程中会有时差问题,特别是在手机中会发现js倒计时时间有问题了,下面来看如何处理这些问题。

在手机版网页中做倒计时(使用服务端时间来倒计时)我们需要考虑到两个问题:1、避免频繁的取服务端时间,2、手机处于锁屏状态或者浏览器/页面在后台运行对倒计时的处理;围绕这两个问题说说我的解决方法(小 虾虎 鱼原创)。

一、服务端时间的获取方法

实现倒计时功能,我们必须要知道剩余时间,知道剩余时间就必须要知道当前时间(服务器时间)和结束时间。 服务器时间和结束时间可以通过两种方式获得:

后端直接在视图中输出;

通过ajax去获取;

为了减少http请求我选择第一种方式,将结束时间和服务端时间直接在视图中输出,如:

<head>
    <script>
        var servertime = '2015-4-10 09:32:17'; 
        var endtime = '2015-4-12 09:00:00';
    </script>
</head>

得到两个时间之后,结束时间endtime是一直不变的,但服务器时间servertime是一直在变的,而我们只得到了一次服务器时间,这时我们需要实现如何与服务器时间同步,我们可以这样做: 在页面打开时我同时记录这一刻的时间,并将这时间保存到一个变量instant中,然后在页面打开后的任一时间想得到服务端的时间可以通过当前本地的时间减去instant的时间再加上servertime时间,即:Date.now() - instant + servertime,我们将下面的js代码放到html页面中的head中(放到head中instant与servertime是同时定义可以减少误差):

var servertime = '2015-4-10 09:32:17'; 
var endtime = '2015-4-12 09:00:00';
var instant = Date.now();

最后我们通过Date.now() - instant + servertime计算时间差来实现倒计时。

【注意】使用此方法会存在以下问题:

如果客户端的时间被修改,那么得到的服务端时间就不正确;
如果网络环境差也会造成一定的误差;

二、设备锁屏或浏览器/页面后台运行的影响

如果设备处于锁屏或者浏览器/页面处于后台运行状态过一段时间再返回到页面,会发现倒计时慢了(具体原因我不知道,有可能浏览器处于休眠状态导致JS的执行暂停,纯属猜测),这时我们需要对倒计时进行校正,对于这个问题我也有两种解决方法:

使用定时器隔一段时间自动校正一次;
使用visibilitychange事件来监听document的隐藏状态,即查看document.hidden值,false为页面显示,true为页面隐藏:

document.addEventListener("visibilitychange", function (e) {

     if(!e.path[0].hidden){ // e.path为页面中document的集合

         // 校正倒计时的代码...

     } 

}, false);

第一种方法随可行但有一定的弊端,建议使用第二种方法。
至此,手机版网页js倒计时的两个问题得到了解决。

http://www.jianshu.com/p/ed46926a392c

[JavaScript] visibilitychange事件

visibilitychange事件是浏览器新添加的一个事件,
当浏览器的某个标签页切换到后台,或从后台切换到前台时就会触发该消息,
现在主流的浏览器都支持该消息了,例如Chrome, Firefox, IE10等。

document.addEventListener("visibilitychange", function(){
alert();
}, false);

现在某些浏览器还保留了visibilitychange的前缀,
例如Chrome浏览器还保留着webkit前缀,
不过该事件已经趋于稳定,在Chrome 33及以后就去掉了前缀,
直接使用visibilitychange

注:
(1)微信内置的浏览器因为没有标签,所以不会触发该事件。
(2)手机端直接按Home键回到桌面,也不会触发该事件。
(3)PC端浏览器失去焦点不会触发该事件,但是最小化,或回到桌面会触发。

http://www.51xuediannao.com/html5/visibilitychange.html

当前窗口获得焦点js事件【visibilitychange】

当前窗口获得焦点js事件,html5发布之前我们使用window.onfocus和window.onblur来获得窗口焦点和失去窗口焦点,使用html5的Page Visibility API来实现

当前窗口获得焦点js事件,html5发布之前我们使用window.onfocus和window.onblur来获得窗口焦点和失去窗口焦点,

监听 onfocus() 和window.onblur()事件实现

//当前窗口得到焦点 
window.onfocus = function() { 
  //播放动画或视频 
}; 
 
//当前窗口失去焦点 
window.onblur = function() { 
  //暂停动画或视频 
};

这个方法可以实现切换标签暂停动画视频,但是会带来一个问题,由于是判断焦点,如果是在当前页面上铺上一个小窗口,那当前页面就暂停了动画,试想,如果你一边看片,一边开个聊天窗口与MM聊天,当你操作聊天窗口的时候,视频暂停了,这并不是你想要的效果。

现在我们来看看HTML5是怎么解决的。H5 提供了很多简单实用的 API,Page Visibility API 就是其中之一。 Page Visibility API能有效的帮助我们完成这样的判断。

使用html5的Page Visibility API来实现

这个 API 本身非常简单,由以下三部分组成。

document.hidden:表示页面是否隐藏的布尔值。页面隐藏包括 页面在后台标签页中 或者 浏览器最小化 (注意,页面被其他软件遮盖并不算隐藏,比如打开的 sublime 遮住了浏览器)。

document.visibilityState:表示下面 4 个可能状态的值

hidden:页面在后台标签页中或者浏览器最小化

visible:页面在前台标签页中

prerender:页面在屏幕外执行预渲染处理 document.hidden 的值为 true

unloaded:页面正在从内存中卸载

Visibilitychange事件:当文档从可见变为不可见或者从不可见变为可见时,会触发该事件。

这样,我们可以监听 Visibilitychange 事件,当该事件触发时,获取 document.hidden 的值,根据该值进行页面一些事件的处理。

document.addEventListener('visibilitychange', function() { 
  var isHidden = document.hidden; 
  if (isHidden) { 
    // 动画视频暂停 
  } else { 
    // 动画视频开始 
  } 
});

结合demo中的实例,切换标签或者最小化的时候,demo中的视频会暂停,恢复当前页面时,demo中的视频会继续播放。完整的代码如下:

var hidden, visibilityChange;  
if (typeof document.hidden !== "undefined") {  
  hidden = "hidden"; 
  visibilityChange = "visibilitychange"; 
} else if (typeof document.msHidden !== "undefined") { 
  hidden = "msHidden"; 
  visibilityChange = "msvisibilitychange"; 
} else if (typeof document.webkitHidden !== "undefined") { 
  hidden = "webkitHidden"; 
  visibilityChange = "webkitvisibilitychange"; 

  
var videoElement = document.getElementById("videoElement"); 
 
// 如果页面被隐藏,则暂停播放,如果页面恢复,则继续播放 
function handleVisibilityChange() { 
  if (document[hidden]) { 
    videoElement.pause(); 
  } else { 
    videoElement.play(); 
  } 

 
// 判断浏览器的支持情况 
if (typeof document.addEventListener === "undefined" || typeof document[hidden] === "undefined") { 
  consol.log("This demo requires a browser, such as Google Chrome or Firefox, that supports the Page Visibility API."); 
} else { 
  // 监听visibilityChange事件    
  document.addEventListener(visibilityChange, handleVisibilityChange, false); 
     
  // 当播放器暂停的时候,将页面标题设置为:Paused. 
  videoElement.addEventListener("pause", function(){ 
    document.title = 'Paused'; 
  }, false); 
     
  // 当播放器正常播放时,将页面标题设置为:Playing. 
  videoElement.addEventListener("play", function(){ 
    document.title = 'Playing';  
  }, false); 
}

js倒计时 手机休眠时 时间不进行减少的更多相关文章

  1. js 倒计时(可自定义时间)

    <html> <head> <title>js 倒计时</title> </head> <body> <div> & ...

  2. js倒计时demo 天/时/分/秒

    <html><head> <meta charset="UTF-8"> <title>js简单时分秒倒计时</title> ...

  3. 原生js倒计时和显示当前时间

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. js 倒计时功能,获取当前时间的年月日,时分秒

    一.实现当前时间到指定截止时间的倒计时功能 <html> <head> <title>TEST</title> </head> <bo ...

  5. js倒计时-倒计输入的时间

    计算指定时间到指定时间之间相差多少天.时.分.秒. 节日.活动.商城常用. 原理: 主要使用到时间戳,也就是从1970 年 1 月 1 日 到指定时间的毫秒数. 1. 求出毫秒差 :当两个时间直接进行 ...

  6. 原生 JS 实现手机验证码倒计时

    可以使用 pointer-events 来阻止元素成为鼠标事件的 target.html5 新增操作元素 class 类名的方式 classList. classList 方法 add(value): ...

  7. JS倒计时两种种实现方式

    最近做浏览器界面倒计时,用js就实现,两种方式: 一:设置时长,进行倒计时.比如考试时间等等 代码如下: <html> <head> <meta charset=&quo ...

  8. 腾讯云短信服务+Node.js给手机发送验证码

    最近公司需要些一个登陆验证和修改密码验证,需要用到验证码,我用Node.js写了一个给手机发验证码的代码,下面实现的功能有:生产验证码,(计时器)验证码失效时间,给手机发送短信. 首先看官方文档,在给 ...

  9. JS倒计时两种种实现方式 很不错

    最近做浏览器界面倒计时,用js就实现,两种方式: 一:设置时长,进行倒计时.比如考试时间等等 代码如下: <html> <head> <meta charset=&quo ...

随机推荐

  1. VC++ QT 数组的初始化

    数组有时会初始化为0. 但加了一个 QThread 的派生类对象之后,数组就不再被初始化为0了. 所以对于数组还是要手动初始化,否则可能产生无法预料的现象.

  2. Linux发送邮件命令mail,mutt

    邮件常常是Linux下监控报警手段之一.Linux下的mail命令可以方便,快速的完成发送邮件. 1. Linux发邮件2种常见客户端命令 1.1 mail命令(推荐) 语法: 无邮件正文 mail ...

  3. 【Linux题目】第四关

    1. 如何过滤出已知当前目录下oldboy中的所有一级目录? 提示:不包含oldboy目录下面目录的子目录和隐藏目录,只要一级目录即可. 解答: ls -F|grep /   通过ls -F给目录后面 ...

  4. 华硕笔记本无法U盘启动,快捷键识别不了

    http://www.udaxia.com/upqd/8254.html 转载于:https://www.cnblogs.com/wanglinjie/p/10507888.html

  5. Vue.js中scoped引发的CSS作用域探讨

    前言 在Vue.js的组件化开发中,常常会对某个组件的style标签加上scoped属性,如<style lang='less' scoped>,这样做的目的在于使这个组件的样式不能轻易在 ...

  6. ZLEXCOUNT key min max

    1 简介 ZLEXCOUNT 命令用于计算有序集合中指定成员之间的成员数量. 2 语法 2.1 完整示例 zlexcount zset [member1 [member5 2.2 说明 指令 是否必须 ...

  7. Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine) B. Homecoming

    After a long party Petya decided to return home, but he turned out to be at the opposite end of the ...

  8. C :uthash

    参考: [1] uthash | 学步园 [2] 源码 [3] 官方文档 [4] [5] 一.哈希表的概念及作用 在一般的线性表或者树中,我们所储存的值写它的存储位置的关系是随机的.因此,在查找过程中 ...

  9. Element upload组件上传图片与回显图片

    场景:新增商品时需要添加商品主图,新增成功之后可编辑 上传图片: <el-form-item label="专区logo:" style="height:160px ...

  10. libevent(五)event

    libevent使用struct event来表示一个事件. #define evutil_socket_t int #define ev_uint8_t unsigned char #define ...