[HTML5]离线存储的应用

离线应用介绍

Web2.0技术鼓励每个人的参与,每个人都是Web内容的撰写者。如果Web应用能够提供离线的功能,让用户在没有网络的地方(例如飞机上)和时候(网络坏了),也能进行内容撰写,等到有网络的时候,再同步到Web上,这就大大方便了用户的使用。HTML5作为新一代的HTML标准,包含了对离线功能的支持。

本地先存些内容,等到连接网络的时候,再同步服务器。

HTML5的离线存储、离线应用

HTML5实现离线应用

1.让apache、nginx、或IIS支持 .manifest文件

AddType text/cache-manifest .manifest

打开apache的配置文件httpd.conf,添加上面的文件类型。

apache添加manifest文件支持

2.创建manifest文件(如: jzcoder.manifest)

CACHE MANIFEST            声明一个头部文件
#This is a comment  
CACHE离线存储文件
style.css
NETWORK:需要网络调用的文件
search.php
FALLBACK:资源失效或不可用时访问的文件
jzcoder404.html

CACHE:表示需要离线存储的资源列表,由于包含manifest文件的页面将被自动离线存储,所以不需要把页面自身也列出来。

NETWORK:表示在它下面列出来的资源只有在在线的情况下才能访问,他们不会被离线存储,所以在离线情况下无法使用这些资源。不过,如果在CACHE和NETWORK中有一个相同的资源,那么这个资源还是会被离线存储,也就是说CACHE的优先级更高。

FALLBACK:表示如果访问第一个资源失败,那么就使用第二个资源来替换他,比如上面这个文件表示的就是如果访问根目录下任何一个资源失败了,那么就去访问jzcoder404.html。

HTML5离线缓存清单文件

3.关联manifest文件到html文档

<html manifest="jzcoder.manifest">

HTML5离线内容的更新

更新缓存

应用程序可以等待浏览器自动更新缓存,也可以使用javascript接口手动出发更新。

自动更新

浏览器除了在第一次访问Web应用时缓存资源外,只会在cache manifest文件本身发生变化时更新缓存。cache manifest中的资源文件发生变化并不会触发更新。

手动更新

开发者也可以使用window.applicationCache的接口更新缓存。方法是检测window.applicationCache.status的值,如果是UPDATEREADY,那么可以调用window.applicationCache.update()更新缓存。

HTML5的applicationCache对象

离线存储如果资源有更新,可以通过如下代码来监听,但第一次加载还会是原来的版本

window.applicationCache.addEventListener('updateready',function(e){
    if(window.applicationCache.status == window.applicationCache.UPDATEREADY){
        window.applicationCache.swapCache();        
        if(confirm("loding new?")){
            window.location.reload()
        }
    }
},false)

浏览器解析manifest

在线的情况下

浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。

离线的情况下

浏览器就直接使用离线存储的资源。

这个过程中有几个问题需要注意

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

对于manifest文件进行缓存的时候需要十分小心,因为可能出现一种情况就是你对manifest文件进行了更新,但是http的缓存规则告诉浏览器本地缓存的manifest文件还没过期,这个情况下浏览器还是使用原来的manifest文件,所以对于manifest文件最好不要设置缓存。

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

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

由于在离线状态,所以浏览器无法访问到manifest文件,但是网页还是可以正常访问,这就是离线存储的威力。

对于HTML5中离线存储对象window.applicationCache有几个事件需要我们关注下:

1.oncached:当离线资源存储完成之后触发这个事件,这个是文档的说法,我在Chrome上面测试的时候并没有触发这个事件。

2.onchecking:当浏览器对离线存储资源进行更新检查的时候会触发这个事件。

3.ondownloading:当浏览器开始下载离线资源的时候会触发这个事件。

4.onprogress:当浏览器在下载每一个资源的时候会触发这个事件,每下载一个资源就会触发一次。

5.onupdateready:当浏览器对离线资源更新完成之后会触发这个事件。

6.onnoupdate:当浏览器检查更新之后发现没有资源更新的时候触发这个事件。

分享到:更多 ()

抢沙发

评论前必须登录!