当前位置: 首页 > news >正文

HTML5 离线缓存详解(转)

  离线缓存是html5新特性之一,简单理解就是第一次加载后将数据缓存,在没有清除缓存前提下,下一次没有网络也可以加载,用在静态数据的网页或游戏比较好用。当然,Html5新的特性都不是所有浏览器都能支持的,离线缓存也一样。反正IE9(包括)及IE9以下的浏览器目前是不支持的。如果用在移动端,应该都能支持。检测是否支持离线缓存也是比较简单的。

if(window.applicationCache){
alert("支持离线缓存");
}
else{
alert("不支持离线缓存");
}

使用起来也很简单。

①:首先要引入manifest文件。

<!DOCTYPE html>
<html lang="en" manifest="test.manifest"> 
//就是在这里引入,注意引入也是讲究路劲跟文件名的,这里文件名是test,后缀是mainfest,路劲在当前的html下面(一般放在html当前文件夹下面也没什么问题,我是这么放的)
<head> <meta charset="UTF-8"> <title>Document</title> </head> <body> </body> </html>

②:引入完了之后,接下来就是test.mainfest文件代码的编写了

解析一下:以#开头的行表示的是注释。

CACHE下面的都是缓存的文件,

NETWORK表示每次都从网络请求,然后缓存,指定的文件总是从网络上请求最新的。

FALLBACK:指定的文件若是找不到,会被重定向到新的地址。规范都是大写。

 

目前为止就实现了离线缓存,再也不用担心第二次打开还耗费流量了,用在静态的手机网页或是游戏比较好用。

③:缓存状态:window.applicationCache 对象是对浏览器的应用缓存的编程访问方式。其 status 属性可用于查看缓存的当前状态。

applicationCache.status的值如下:

0 === 未缓存

1 === 空闲(缓存为最新状态)

2 === 检查中

3 === 下载中

4 === 更新就绪

5 === 缓存过期

var appCache = window.applicationCache;
switch (appCache.status) {
    case appCache.UNCACHED: // UNCACHED == 0 
        return 'UNCACHED';
        break;
    case appCache.IDLE: // IDLE == 1 
        return 'IDLE';
        break;
    case appCache.CHECKING: // CHECKING == 2 
        return 'CHECKING';
        break;
    case appCache.DOWNLOADING: // DOWNLOADING == 3 
        return 'DOWNLOADING';
        break;
    case appCache.UPDATEREADY: // UPDATEREADY == 4 
        return 'UPDATEREADY';
        break;
    case appCache.OBSOLETE: // OBSOLETE == 5 
        return 'OBSOLETE';
        break;
    default:
        return 'UKNOWN CACHE STATUS';
        break;
};

 

④:主动更新缓存:applicationCache.update()

//利用定时器隔一定时间自动更新一下缓存
setInterval(function(){applicationCache.update();
},50000);

⑤:介绍一下缓存相关的事件。

1、updateready事件:当有新的缓存,并更新完以后,会触发此事件。

例如代码:

applicationCache.addEventListener("updateready",function(){
  alert("缓存更新完成");
},false);

2、progress事件:当有新的缓存,并处于正在下载的过程中时,会不断触发此事件。progress中的event对象包含:loaded和total。loaded代表当前已经加载完成的文件,total为总共需要更新的文件数。

applicationCache.addEventListener("progress",function(){
alert(applicationCache.status); //3... 3表示正在下载
},false);

3、其他事件:

checking事件:正在检查

downloading事件:正在下载

updatereadey事件:更新完成,(第一次加载页面不会触发)

obsolete事件:缓存过期

cached事件:缓存完成之后触发(第一次加载页面的时候),空闲,缓存为最新状态

error事件:报错

noupdate事件:检查更新结束,没有需要更新。

applicationCache对象

  该对象是window对象的直接子对象,window.applicationCache

  基类:DOMApplicationCache

  事件列表:

事件接口触发条件后续事件
checkingEvent

用户代理检查更新或者在第一次尝试下载manifest文件的时候,本事件往往是事件队列中第一个被触发的

noupdatedownloadingobsoleteerror
noupdateEvent检测出manifest文件没有更新
downloadingEvent用户代理发现更新并且正在取资源,或者第一次下载manifest文件列表中列举的资源progresserrorcachedupdateready
progressProgressEvent

用户代理正在下载资源manifest文件中的需要缓存的资源

progresserrorcachedupdateready
cachedEventmanifest中列举的资源已经下载完成,并且已经缓存
updatereadyEvent

manifest中列举的文件已经重新下载并更新成功,接下来js可以使用swapCache()方法更新到应用程序中

obsoleteEvent

manifest的请求出现404或者410错误,应用程序缓存被取消

errorEvent

manifest的请求出现404或者410错误,更新缓存的请求失败

manifest文件没有改变,但是页面引用的manifest 文件没有被正确地下载

在取manifest列举的资源的过程中发生致命的错误

在更新过程中manifest文件发生变化

用户代理会尝试立即再次获取文件

  

  属性:status 返回缓存的状态

  

可选值匹配常量描述
0
appCache.UNCACHED
未缓存
1
appCache.IDLE
闲置
2
appCache.CHECKING
检查中
3
appCache.DOWNLOADING
下载中
4
appCache.UPDATEREADY
已更新
5
appCache.OBSOLETE
失效

 

  方法

方法名描述
update()发起应用程序缓存下载进程
abort()取消正在进行的缓存下载
swapcache()切换成本地最新的缓存环境

 

 

manifest解析机制

 

 

注意事项

  • 站点离线存储的容量限制是5M
  • 如果manifest文件,或者内部列举的某一个文件不能正常下载,整个更新过程将视为失败,浏览器继续全部使用老的缓存
  • 引用manifest的html必须与manifest文件同源,在同一个域下
  • 在manifest中使用的相对路径,相对参照物为manifest文件
  • CACHE MANIFEST字符串应在第一行,且必不可少
  • 系统会自动缓存引用清单文件的 HTML 文件
  • manifest文件中CACHE则与NETWORK,FALLBACK的位置顺序没有关系,如果是隐式声明需要在最前面
  • FALLBACK中的资源必须和manifest文件同源
  • 当一个资源被缓存后,该浏览器直接请求这个绝对路径也会访问缓存中的资源。
  • 站点中的其他页面即使没有设置manifest属性,请求的资源如果在缓存中也从缓存中访问
  • 当manifest文件发生改变时,资源请求本身也会触发更新

相关文章:

  • apache配置rewrite及.htaccess文件
  • SqlServer数据库全角转换成半角
  • 转-临界区对象TCriticalSection与TRTLCriticalSection的区别
  • 20160623
  • vSphere部署系列之05——虚拟机的创建和设置
  • 练出更好的团队
  • mysql整数
  • IOS过滤全局的Emoji表情输入
  • HTML5 网络拓扑图性能优化
  • [备忘]如何接收向shell脚本传入的参数
  • qt QClipBoard
  • redis window版本设置密码,但是无效的解决方案
  • Swift基础--Swift中的异常处理
  • 【iCore3 双核心板_ uC/OS-III】例程十一:任务消息队列
  • id 选择器
  • “大数据应用场景”之隔壁老王(连载四)
  • angular2开源库收集
  • C++类中的特殊成员函数
  • git 常用命令
  • k个最大的数及变种小结
  • Python中eval与exec的使用及区别
  • underscore源码剖析之整体架构
  • vuex 笔记整理
  • 区块链共识机制优缺点对比都是什么
  • 三栏布局总结
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 运行时添加log4j2的appender
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 你对linux中grep命令知道多少?
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #pragma 指令
  • #考研#计算机文化知识1(局域网及网络互联)
  • (1)Nginx简介和安装教程
  • (C++)八皇后问题
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (第一天)包装对象、作用域、创建对象
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)模仿学习-Action数据的模仿
  • (转)Mysql的优化设置
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .NET 常见的偏门问题
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net的socket示例
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net开发引用程序集提示没有强名称的解决办法