HTML5--离线web应用

HTML5新增了离线应用,离线应用使得我们可以在网页或应用在没有网络的情况下依然可以使用。
离线应用的使用需要以下几个步骤:

  • 离线检测(确定是否联网)
  • 访问一定的资源
  • 有一块本地空间用于保存数据(无论是否上网都不妨碍读写)

使用HTML5离线web应用

1、检查浏览器的支持情况的方法

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

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

首行必须以以下字符串开始

    CACHE MANIFEST

剩下的就是要缓存的文件的URL,一行一个(相对URL是相对于清单文件而言的,不是相对于文件)

    #以“#”开头的是注释
    common.css
    common.js

这样这个文件中列举的所有的文件都会被缓存

在清单中,可以使用特殊的区域头来标识头信息之后的清单项的类型,上面的最简单的缓存属于"CACHE:"区域。
像这样

    #该头信息之后的内容需要缓存
    CACHE:
    common.css
    connom.js

以"NETWORK:"开头的区域列举的文件,总是从线上获取,不缓存
NETWORK:头信息支持通配符"*",表示任何未明确列举的资源,都将通过网络加载

    #该头信息之后的内容不需要缓存,总是从线上获取
    NETWORK:
    a.css
    #表示以name开头的资源都不要缓存
    name/ 

以"FALLBACK:"开头的区域中的内容,提供了获取不到缓存资源时的备选资源路径
该区域中的内容,每一行包含两个URL(第一个URL是一个前缀,任何匹配的资源都不被缓存,第二个URL表示需要被缓存的资源)

    FALLBACK:
    name/  example.html

一个清单可以有任意多个区域,且位置没有限制。

3、搭建离线应用程序
假设我们要构建一个包含css,js,html的单页应用,同时要为这个单页应用添加离线支持。
要将描述文件与页面关联起来,需要使用html标签的manifest特性指定描述文件的路径

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

开发离线应用的第一步就是检测设备是否离线

  • HTML5新增了navigator.onLine属性
    当该属性为true的时候表示联网,值为false的时候,表示离线

      if(navigator.onLine){
          //联网
      }else{
          //离线
      }
    

** 注:IE6及以上浏览器及其他标准浏览器都支持这个属性 **

  • online事件(IE9+浏览器支持)

当网络从离线变为在线的时候触发该事件,在window上触发该事件,不需要刷新

    window.online = function(){
        //需要触发的事件
    }
  • offline事件(IE9+浏览器支持)
    当网络从在线变为离线的时候触发该事件,和online事件一样,在window上触发该事件,不需要刷新

      window.offline = function(){
          //需要触发的事件
      }
    

应用缓存

应用缓存(Application Cache)是从浏览器的缓存中分出来的一块缓存区(大小根据具体浏览器而定,一般是5M)

应用缓存和网页缓存的区别:

  • 应用缓存为整个web应用程序服务,网页缓存服务于单个网页
  • 应用缓存只缓存指定页面需要的指定资源(可人为控制),任何网页都具有网页缓存(浏览器默认行为)
  • 应用缓存不会随着清除浏览器缓存而消失
  • 应用缓存不会像网页缓存那样,老数据会被最新一次的新数据替代
  • 应用缓存可以离线访问,网页缓存必须在线访问
  • 应用缓存可靠,可控,网页缓存不可控

应用缓存的优势

  • 离线浏览
  • 速度更快--已缓存资源加载更快
  • 减少负载--浏览器只从服务器下载更新过的文件

一个web应用首次下载并缓存之后,任何加载请求都优先来自于缓存,因此可以实现离线缓存。如果不需要使用离线缓存了,就需要在服务器端删除描述文件,或者删除HTML页面中的manifest属性。

一旦应用被缓存,则缓存始终不变。那么,怎样才能改变缓存

  • 用户清空应用缓存
  • manifest文件被修改
  • 使用update()方法更新缓存

如果服务器上的文件有所修改的话,那么修改描述文件中注释行的日期或者版本号是一个不错的使浏览器重新缓存文件的办法

此外,我们还可以使用HTML5提供的API来操作和更新缓存

applicationCache API

applicationCache API是一个操作应用缓存的接口。新的window.applicationCache对象可以触发一系列与缓存状态相关的事件。
这个对象有一个status属性,值为常量,表示缓存状态

  • 0:没有与页面相关的应用缓存(未缓存)
  • 1:应用缓存未得到更新(空闲)
  • 2:正在下载描述文件并检查更新(检查中)
  • 3:应用缓存正在下载描述文件中指定的资源(下载中)
  • 4:应用缓存已经更新了资源,而且所有资源都已下载完毕,可以通过swapCache()来使用了(更新就绪)
  • 5:应用缓存的描述文件不存在了,页面无法再访问应用缓存(已过期)

这个对象有以下事件,表示其状态的改变

  • 每次载入一个设置了manifest属性的HTML文件,首先会触发checking事件
  • 如果应用程序已经缓存,并且清单文件没有改动,则浏览器触发noupdate事件
  • 如果应用程序已经缓存,并且清单文件发生改动,则浏览器触发downloading事件,下载完毕后触发updateready事件
  • 如果应用程序未缓存,则downloading事件和progress事件都会触发,但是下载完成后触发cached事件而不是updateready事件
  • 如果处于离线,无法检测清单状态,则触发error事件,如果引用一个不存在的清单文件,也会触发error事件
  • 如果处于在线,应用也缓存了,但是清单文件不存在,则会触发obsolete事件,并将应用程序从缓存中清除。

一般来讲,这些事件会随着页面加载按上述顺序依次触发

update()方法

通过update()方法也可以手工干预,让应用缓存为检查更新而触发上述事件

    applicationCache.update();

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

swapCache()方法

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

    applicationCache.onupdateready = function(){
        applicationCache.swapCache();
    };

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

    window.applicationCache.onupdateready = function(){
        var con = comfirm('有新内容可用,是否重新加载?');
        if(con){
            location.reload();
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,050评论 25 707
  • 网上说玻璃心是指很容易就受到打击,心理承受力不强,过分脆弱的人。 直接的字面意思指内心太脆弱,非常非常容易受到伤害...
    不吃你阅读 426评论 0 0
  • 循环结构:选择结构:Swift后面一定要有大口号; for in for _ i in 1...4{printl...
    酸po萄阅读 154评论 0 0
  • "i'm rubbing my tummyand touching my belly buttoni'm stok...
    不会改名的苗苗蜜阅读 397评论 1 1