zoukankan      html  css  js  c++  java
  • HTML5的离线应用

    参考:有趣的HTML5:离线存储——segmentfault

    HTML5的离线存储

    简介

    HTML5提供了很多新的功能以及相应的接口,离线存储就是其中的一个。通过浏览器访问Web App需要联网发送请求,这样就使得用户在离线的状态下无法使用App,但是Web App中一部分资源并不是经常改变,并不需要每次都向服务器发出请求,出于这些原因,HTML5提出了离线存储的新功能。

    离线存储可以将站点的一些文件存储在本地,在没有网络的时候还是可以访问到以缓存的对应的站点页面,其中这些文件可以包括html,js,css,img等等文件,但其实即使在有网络的时候,浏览器也会优先使用已离线存储的文件,返回一个200(from cache)头。这跟HTTP的缓存使用策略是不同的。

     

    用法

    1、缓存清单manifest 

    CACHE MANIFEST//必须以这个开头
    version 1.0 //最好定义版本,更新的时候只需修改版本号
    CACHE:
        m.png
        test.js
        test.css
    NETWORK:
        *
    FALLBACK:
        online.html offline.html

    CACHE: 指定你要浏览器进行离线存储的文件列表,一个文件一行
    NETWORK: 跟CACHE相反,指定浏览器一定要通过网络访问的文件列表
    FALLBACK(可选): 如果通过网络访问失败了,就去访问紧跟着的那个在本地缓存好的文件文件

    指定上述文件,可以用相对路径,也可以用绝对路径,都是ok的。但是绝对路径要加上http://

    编辑好这个文件以后就在html文件中引入这个文件浏览器就可以知道要缓存那些文件了。

     

    2、浏览器怎么解析manifest

    浏览器对离线的资源进行管理和加载的

    • 在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,

    如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。

    如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会根据HTTP的缓存策略去探测manifest清单是否最新版本,如果最新,就不做任何操作,如果不是最新,那么就会重新下载文件中的资源并进行离线存储。

    • 离线的情况下,浏览器就直接使用离线存储的资源。

    注意:

    • 如果服务器对离线的资源进行了更新,那么必须更新manifest文件版本之后这些资源才能被浏览器重新下载,如果只是更新了资源而没有更新manifest文件的话,浏览器并不会重新下载资源,也就是说还是使用原来离线存储的资源。

    • 由于判断manifest清单是否最新是利用了HTTP的缓存策略的,所以可能出现你对manifest文件进行了更新,但浏览器还是使用原来的manifest文件的情况,这是因为http的缓存策略告诉浏览器本地缓存的manifest文件还没过期,所以对于manifest文件进行的缓存要十分小心。

    • 浏览器在下载manifest文件中的资源的时候,它会一次性下载所有资源,如果某个资源由于某种原因下载失败,那么这次的所有更新就算是失败的,浏览器还是会使用原来的资源。

    • 在更新了资源之后,新的资源需要到下次再打开app才会生效,如果需要资源马上就能生效,那么可以使用window.applicationCache.swapCache()方法来使之生效,出现这种现象的原因是浏览器会先使用离线资源加载页面,然后再去检查manifest是否有更新,所以需要到下次打开页面才能生效。

     

    3、HTML5中对应的离线存储API

    支持H5离线存储的浏览器使用window.applicationCache对象,在浏览器处理离线存储的期间触发各种事件,对象说明具体如下

    1. oncached:当离线资源存储完成之后触发这个事件,这个是文档的说法,我在Chrome上面测试的时候并没有触发这个事件。
    2. onchecking:当浏览器对离线存储资源进行更新检查的时候会触发这个事件
    3. ondownloading:当浏览器开始下载离线资源的时候会触发这个事件
    4. onprogress:当浏览器在下载每一个资源的时候会触发这个事件,每下载一个资源就会触发一次。
    5. onupdateready:当浏览器对离线资源更新完成之后会触发这个事件
    6. onnoupdate:当浏览器检查更新之后发现没有资源更新的时候触发这个事件
  • 相关阅读:
    LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)
    LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
    LeetCode 617. 合并二叉树(Merge Two Binary Trees)
    LeetCode 206. 反转链表(Reverse Linked List) 16
    LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
    LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
    LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
  • 原文地址:https://www.cnblogs.com/zs-note/p/7131111.html
Copyright © 2011-2022 走看看