HTML5-离线存储

1. 在HTML5的html标签中添加一个 manifest="XXX.appcache" 属性声明

<!DOCTYPE html>
<html manifest="list.appcache">

2.XXX.appcache文件中定义需要缓存的文件清单(里面的资源文件的路径是相对于manifest的路径而言的)

CACHE MANIFEST
# VERSION 0.3
# 直接缓存的文件
CACHE:
# 需要在线访问的文件
NETWORK:
# 替代方案
FALLBACK:

CACHE MANIFEST --(必须) 此标题下列出的文件将在首次下载后进行缓存

#V1.0.2
../addDevice.html
../static/css/reset.css
../static/js/addDevice.js
../static/img/ms1.png
../static/img/clean-face.jpg

NETWORK----(可选)

(1)通配符‘*‘表示不在CACHE MANIFEST清单里的文件,每次都要重新请求 (虽然不从离线应用缓存中获取资源,但是http cache是可用的)

*

(2)或者指定特定文件,比如login.asp不被离线存储,每次都要重新发起请求

login.asp

FALLBACK----(可选)   断网时访问指定路径时的替换文件

如断网时访问/html5/ 目录下的所有资源文件,则用 "offline.html" 替代

/html5/   /offline.html

更新原理

更新了manifest文件,浏览器会自动的重新下载新的manifest文件并把manifest缓存列表中的所有文件重新请求一次(第二次刷新替换本地缓存为最新缓存),而不是单独请求某个特定修改过的资源文件,因为manifest是不知道哪个文件被修改过了的。

对于全局更新不必要担心,因为没有更新过的资源文件,请求依旧是304响应,只有真正更新过的资源文件才是服务器返回的才是200.

所以控制离线存储的更新,需要2个步骤,一是更新资源文件,二是更新manifest文件,只要修改manifest文件随意一处,浏览器就会感知manifest文件更新,而我们的资源文件名称通常是固定的,需要更新manifest文件怎么操作呢?一个比较好的方式是更新以# 开头的版本号注释,告诉浏览器这个manifest文件被更新过。

manifest资源是滞后静默更新的

第二次刷新界面之后,才能看到更新后的效果

   /*code1,简单粗暴的*/
    applicationCache.onupdateready = function(){
        applicationCache.swapCache(); //强制替换缓存
        location.reload();            //重新加载页面
    };
    /*code2,缓存公用方法*/
    // var EventUtil = {
    //     addHandler: function(element, type, handler) {
    //         if (element.addEventListener) {
    //             element.addEventListener(type, handler, false);
    //         } else if (element.attachEvent) {
    //             element.attachEvent("on" + type, handler);
    //         } else {
    //             element["on" + type] = handler;
    //         }
    //     }
    // };
    // EventUtil.addHandler(applicationCache, "updateready", function() {      //缓存更新并已下载,要在下次进入页面生效
    //     applicationCache.update();  //检查缓存manifest文件是否更新,ps:页面加载默认检查一次。
    //     applicationCache.swapCache();  //交换到新的缓存项中,交换了要下次进入页面才生效
    //     location.reload();              //重新载入页面
    // });

applicationCache      提供了如下的事件
Event handler             Event handler event type
onchecking                 checking
onerror                       error
onnoupdate                noupdate
ondownloading            downloading
onprogress                  progress
onupdateready            updateready
oncached                    cached
onobsolete                  obsolete

提供了如下的API:

void update();
// 更新, 但是这个方法适用于一些长期打开的页面,而不会有刷新动作,比如邮件系统,所以这个就比较适合做自动更新下载

void abort();
// 取消

void swapCache();
// 替换缓存内容 ,对于manifest文件的改变,通常是下一次的刷新才会触发下载更新,第二次刷新才会切换使用新的缓存文件,通过这个方法,可以强制将缓存替换

注意事项

站点中的其他页面即使没有设置manifest属性,请求的资源如果在缓存中也从缓存中访问

系统会自动缓存引用清单文件的 HTML 文件

如果manifest文件,或者内部列举的某一个文件不能正常下载,整个更新过程将视为失败,浏览器继续全部使用老的缓存

在manifest中使用的相对路径,相对参照物为manifest文件

站点离线存储的容量限制是5M

manifest文件中CACHE则与NETWORK,FALLBACK的位置顺序没有关系,如果是隐式声明需要在最前面

manifest中必须一一声明文件名,这很令人头痛

引用manifest的html必须与manifest文件同源,在同一个域下

除此之外,还增加了两大问题:

(1)PV UV的计算难题,由于当前页面被强制加入manifest,那么PV 和UV的统计,成了一个难题,因为请求不再是发送到服务器;

(2)缓存对于某个使用manifest的文件,其带有的参数可能是随机性的统计参数,如sid=123sss, sid=234fff ,尤其是比如商品详情的id字段等,这样每个页面都自动加入到manifest中,将会带来很大的存储开销,而且是毫无意义的;

所以伴随而来的,是如何在现有的体系架构下进行数据统计的难题,

对于第一个问题  常规方案是进入离线存储页面后自动发出ajax请求,以告知服务器统计PV UV;

对于第二个问题,是将GET请求方式改成POST方式。

时间: 2024-10-07 19:05:57

HTML5-离线存储的相关文章

【html5】html5离线存储

html5本地存储之离线存储 1.为什么使用离线存储 ①最新的主流的浏览器中都已添加了对HTML5的offline storage功能的支持,HTML5离线存储功能非常强大, 它的作用是:在用户没有与因特网连接时,照样可以访问站点或应用,在用户与因特网连接时,自动更新缓存数据,是我们的网站的适应性和应用型更强 2.准备工作 1.服务器配置 1.需要在 apache配置文件加:① AddType text/cache-manifest .manifest 2.创建缓存清单文件xxx.manifes

HTML5 离线存储应用案例

HTML5 所谓的离线存储就是将一些资源文件保存在本地,这样后续的页面重新加载将使用本地资源文件,在离线情况下可以继续访问web应用,同时通过一定的手法(更新相关文件或者使用相关API),可以更新.删除离线存储等操作: 下面简单来使用一下离线存储:  第一:要在 apche 服务器的 httpd.conf文件中添加下面这段话 AddType text/cache-manifest .manifest 第二:建一个 1.manifest 文件, 然后这里的清单是 #下面这句话必须存在,而且必须放在

吓哭原生App的HTML5离线存储技术,却出乎意料的容易!【低调转载】

吓哭原生App的HTML5离线存储技术,却出乎意料的容易![WeX5低调转载] 2015-11-16 lakb248 起步软件 近几天,WeX5小编编跟部分移动应用从业人士聊了聊,很多已经准备好全面拥抱HTML5.但WeX5小编编也发现,依然有相当一部分从业者,仍然对HTML5将信将疑,仍对原生App技术恋恋不舍.小编编特意转发分享下文,HTML5技术崛起,从离线存储技术是可见一斑的. (正文)随着Web App的发展,越来越多的移动端App使用HTML5的方式来开发,除了一些Hybrid Ap

HTML5 离线存储之Web SQL

HTML5 在离线存储之Web SQL 本篇没有考虑异步,多线程及SQL注入 WebDatabase 规范中说这份规范不再维护了,原因是同质化(几乎实现者都选择了Sqlite), 且不说这些,单看在HTML5中如何实现离线数据的CRUD,最基本的用法(入门级别)  1,打开数据库 2,创建表 3,新增数据 4,更新数据 5,读取数据 6,删除数据 事实上,关键点在于如何拿到一个可执行SQL语句的上下文, 像创建表,删除表,CRUD操作等仅区别于SQL语句的写法.OK,貌似"SqlHelper&q

让我们使用离线吧(HTML5离线存储)

什么是离线网络应用程序?乍一看,从以下几个方面来说就像一个矛盾.网页是需下载并呈现的.下载意味着网络连接.你怎能在离线的时候下载?当然,你不能.但你可以在你在线的时候下载.这就是HTML5离线应用程序怎样工作的. 最简单来说,一个离线网络应用程序就是一个URL的列表——HTML,CSS,JavaScript,图片,或者其他类型的资源.离线网络应用程序的 注意指向一个叫做名单文件并用于定位网络服务器上任何文本文件的列表.用于执行HTML5离线以用程序的网络浏览器将从名单文件中读取URL列表,下载这

HTML5离线存储和本地缓存

一.离线存储 有一个web应用有三个文件index.html,a.js,b.css,现在需要把js和css文件缓存起来 1.在index.html里加上<html manifest="test.manifest"> 2.manifest清单格式如下 CACHE MANIFEST #上面一句必须 #v1.0.0 #需要缓存的文件 CACHE: a.js b.css #不需要缓存的文件 NETWORK: * #无法访问页面 FALLBACK: 404.html 3.manife

记录HTML5离线存储的一些比较容易忽略的知识点

1 当HTML文件中关联了manifest文件,那么当前文件会默认被缓存.但是缓存的也仅仅是这个HTML文件,如果该文件中关联了其他文件,如JS,CSS,图片,那么 就需要手动将这些文件加入manifest清单列表中,否则离线后这些文件不会被加入缓存之中,导致载入失败. 2 当断网之后,更新manifest和关联文件,刷新页面,会报错:Manifest fetch failed ,因为manifest列表被更新,那么浏览器会发送请求进行更新manifest列表中的文件, 但是因为断网,更新失败,

处理html5离线应用程序存储的一些问题。

manifest方法引入appcache文件,缓存页面,是html5的新特性,通过加载一次,下次自动读取缓存,加载速度快,离线也能加载.缺点就是,被加载的页面会被强制缓存所有的内容. 为了解决不加载所有内容这个问题,经过我反复研究,终于找到了两个解决方案,不多说,看代码. 引入html5离线存储,需要在页面头文件引入.appcache文件,如下: <html lang="zh-CN" manifest="${ctx }/plugins/mobileweb/web/vie

HTML5的五种客户端离线存储方案

最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利用了Cookie.WebStorage.IndexedDB以及FileSystem四种本地离线存储方式,对燃气监控系统的表计位置.朝向.开关以及表值等信息做了CURD的存取操作. http://www.hightopo.com/guide/guide/core/serialization/examples/example_exportimport.html HTM

html5的离线存储问题汇总

HTML5的一个重要特性就是离线存储,所谓的离线存储就是将一些资源文件保存在本地,这样后续的页面重新加载将使用本地资源文件,在离线情况下可以继续访问web应用,同时通过一定的手法(更新相关文件或者使用相关API),可以更新.删除离线存储等操作: HTML5的离线存储使用一个manifest文件来标明哪些文件是需要被存储的,使用如 <html manifest='offline.manifest'> 来引入一个manifest文件,这个文件的路径可以是相对的,也可以是绝对的,如果你的web应用很