有趣的HTML5:离线存储
来源:互联网 发布:js判断只能输入正整数 编辑:程序博客网 时间:2024/05/16 06:18
随着Web App的发展,越来越多的移动端App使用HTML5的方式来开发,除了一些HybridApp以外,其他一部分Web App还是通过浏览器来访问的,通过浏览器访问就需要联网发送请求,这样就使得用户在离线的状态下无法使用App,同时Web App中一部分资源并不是经常改变,并不需要每次都向服务器发出请求,出于这些原因,HTML5提出的一个新的特性:离线存储。通过离线存储,我们可以通过把需要离线存储在本地的文件列在一个manifest配置文件中,这样即使在离线的情况下,用户也可以正常使用App。
怎么用
首先来讲解下离线存储的使用方法,说起来也很简单。只要在你的页面头部像下面一样加入一个manifest
的属性就可以了。
<!DOCTYPE HTML><html manifest = "cache.manifest">...</html>
然后cache.manifest
文件的书写方式,就像下面这样:
CACHE MANIFEST#v0.11CACHE:js/app.jscss/style.cssNETWORK:resourse/logo.pngFALLBACK:/ /offline.html
离线存储的manifest一般由三个部分组成:
1.CACHE:表示需要离线存储的资源列表,由于包含manifest文件的页面将被自动离线存储,所以不需要把页面自身也列出来。
2.NETWORK:表示在它下面列出来的资源只有在在线的情况下才能访问,他们不会被离线存储,所以在离线情况下无法使用这些资源。不过,如果在CACHE和NETWORK中有一个相同的资源,那么这个资源还是会被离线存储,也就是说CACHE的优先级更高。
3.FALLBACK:表示如果访问第一个资源失败,那么就使用第二个资源来替换他,比如上面这个文件表示的就是如果访问根目录下任何一个资源失败了,那么就去访问offline.html。
浏览器怎么解析manifest
那么浏览器是怎么对离线的资源进行管理和加载的呢?这里需要分两种情况来讨论。
- 在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。
- 离线的情况下,浏览器就直接使用离线存储的资源。
这个过程中有几个问题需要注意。
- 如果服务器对离线的资源进行了更新,那么必须更新manifest文件之后这些资源才能被浏览器重新下载,如果只是更新了资源而没有更新manifest文件的话,浏览器并不会重新下载资源,也就是说还是使用原来离线存储的资源。
- 对于manifest文件进行缓存的时候需要十分小心,因为可能出现一种情况就是你对manifest文件进行了更新,但是http的缓存规则告诉浏览器本地缓存的manifest文件还没过期,这个情况下浏览器还是使用原来的manifest文件,所以对于manifest文件最好不要设置缓存。
- 浏览器在下载manifest文件中的资源的时候,它会一次性下载所有资源,如果某个资源由于某种原因下载失败,那么这次的所有更新就算是失败的,浏览器还是会使用原来的资源。
- 在更新了资源之后,新的资源需要到下次再打开app才会生效,如果需要资源马上就能生效,那么可以使用
window.applicationCache.swapCache()
方法来使之生效,出现这种现象的原因是浏览器会先使用离线资源加载页面,然后再去检查manifest是否有更新,所以需要到下次打开页面才能生效。
- 有趣的HTML5:离线存储
- 有趣的HTML5:离线存储
- 有趣的HTML5:离线存储
- 有趣的HTML5:离线存储
- 有趣的HTML5:离线存储
- 有趣的HTML5:离线存储
- 有趣的HTML5:离线存储
- 有趣的HTML5:离线存储
- 有趣的HTML5:离线存储
- HTML5的离线存储
- 让 JavaScript 拯救 HTML5 的离线存储
- 让 JavaScript 拯救 HTML5 的离线存储
- 让 JavaScript 拯救 HTML5 的离线存储
- html5离线存储与cookie的区别
- html5的离线存储问题汇总
- html5的离线存储问题汇总
- HTML5+的离线本地存储方案
- [html5]离线存储
- Go语言内存分配器-MSpan
- c++笔试题总结1
- Andoid 调用相机程序获取图片
- 封装一个Android数据库框架
- 【C/C++】Linux下使用system()函数一定要谨慎
- 有趣的HTML5:离线存储
- Android 从相册选择图片
- java 测试 solr更新和查询
- 在数据库创建表的时候,时间设置为什么类型,会随着每次提交的时间发生变化
- Spring事务传递性探讨
- 实现类似微信Viewpager-Fragment的惰性加载,lazy-loading
- (*(volatile unsigned int *))详解
- iOS WebView JS 交互
- Uri类型理解