美文网首页
js前端开发—离线应用篇—离线检测和应用缓存

js前端开发—离线应用篇—离线检测和应用缓存

作者: BeYanJin | 来源:发表于2017-03-09 23:25 被阅读0次

参考资料

《Javascript高级层序设计》(第3版)
JavaScript | MDN
HTML5系列之——applicationCache对象

前言

本人菜鸟,入IT只为当鼓励师。本编文章主要介绍 如何判断设备是在线还是离线 (navigator.onLine 属性,online和offline事件),如何实现应用缓存(描述文件,<html>的mainfest属性,applicationCache对象)。

一、什么是离线Web应用

  • 离线Web应用,就是在设备不能上网的情况下仍然可以运行的应用。
  • 离线Web应用是 HTML5 新增的一个重点技术。

二、开发离线应用的条件

  • 能够判断出设备是在线还是离线
  • 能够访问一定的资源(css、JavaScript、图像等)
  • 必须有一块本地(客户端)空间用于保存数据

三、使用HTML5开发离线应用

1. 离线检测

1.1 navigator.onLine 属性

  • 为了判断设备是否在线,HTML5 定义了一个 navigator.onLine 属性
  • navigator.onLine 是一个只读属性,它返回一个 Boolean 值:
    true —— 表示 设备能上网,即设备在线;
    false —— 表示 设备离线。
  • 下面这段代码能在IE6+和Safari 5+正常执行;在Chrome11及之前的版本中,navigator.onLine 的值始终为 true,但早在2011年10月出的新版就已经解决了这个bug。Firefox 4 + 和 Opera 11.10 +,支持该属性,但必须手工选中菜单项“文件——>Web开发人员(设置)——>脱机工作”才能让浏览器正常工作。
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>判断设备是否能上网</title>
</head>
<body>
    <p>你现在的状态是 <script>document.write(navigator.onLine ? "在线" : "离线");</script></p>
</body>
</html>
各个浏览器对 navigator.online 的兼容性

1.2 online 和 offline 事件

  • 为了更好的确定网络是否可用,HTML5还定义了两个事件:onlineoffline
  • online 事件:当网络从离线变为在线时触发;(IE9+浏览器支持)
    offline 事件:当网络从在线变为离线时触发。(IE9+浏览器支持)
  • 这两个事件在window对象上触发。
  • 为了检测应用是否离线,在页面加载后,最好先通过 navigator.onLine 取得初始的状态,然后通过上述两个事件来确定网络连接状态是否变化。下面代码是实现兼容性最优的方案。
  • 代码中用到 EventUtil.js 文件,它提供了一个兼容所有浏览器的事件绑定对象。可点击蓝色字体从我的github中下载该文件。
<!DOCTYPE html>
<html>
<head>
    <title>Online Events Example</title>
<script type="text/javascript" src="EventUtil.js"></script>
</head>
<body>
    <p>你现在的状态是 <span id="status"><script>document.write(navigator.onLine ? "在线" : "离线");</script></span></p>
    <script>
        EventUtil.addHandler(window, "online", function(){
            document.getElementById("status").innerHTML = "在线";
        });
        EventUtil.addHandler(window, "offline", function(){
            document.getElementById("status").innerHTML = "离线";
        });
    </script>
</body>
</html>
各种兼容性问题

2. 应用缓存

HTML5的应用缓存,简称为appcache。Appcache就是从浏览器的缓存中分出来的一块缓存区。可以使用一个描述文件(manifest file),列出要下载和缓存的资源,这样就能在这个缓存中保存数据了。

2.1 检测浏览器是否支持应用缓存

if (window.applicationCache) {
    //浏览器支持离线应用
}

2.2 描述文件

  • 描述文件用来列出需要缓存和不需要缓存的资源,以备离线时使用。
  • 描述文件的扩展名以前用.manifest,现在推荐使用.appcache,并且描述文件需要配置正确的MIME-type,即"text/cache-manifest",必须在web服务器上进行配置(文件编码必须是UTF-8)。
  • 具体格式:


2.3 将描述文件和页面关联

<html manifest='./offline.appcche'>

2.4 window.applicationCache 对象

2.4.1 status属性
  • applicationCache 有一个 status 属性,属性值是常量:
2.4.2 可绑定在applicationCache对象上的事件
  • applicationCache 还有很多相关的事件:
2.4.3 update() 方法
  • applicationCache 对象的 update() 方法:
    通过update()方法也可以手工干预,让应用缓存为检查更新而触发上述事

     applicationCache.update();
    

update()一经调用,应用缓存就会去检查描述文件是否更新,触发checking事件,然后页面就会像刚刚加载一样,继续执行后续操作。如果触发了cached事件,则说明应用缓存已经准备就绪,不会再发生其他操作。

2.4.4 swapCache()方法

如果触发了updateready事件,则说明新版本的应用缓存已经可用,需要调用swapCache()方法来启用新的应用缓存。

applicationCache.onupdateready = function(){
    applicationCache.swapCache();
};
2.4.5 注意事项

浏览器检查清单文件,以及更新缓存的操作是异步的,因此可能是在载入旧缓存之后进行,因此可能需要载入两次才能显示最新的内容,因此需要提示用户。

window.applicationCache.onupdateready = function(){
    var con = comfirm('有新内容可用,是否重新加载?');
    if(con){
        location.reload();
    }
}

相关文章

网友评论

      本文标题:js前端开发—离线应用篇—离线检测和应用缓存

      本文链接:https://www.haomeiwen.com/subject/ikyggttx.html