23.2 应用缓存

优质
小牛编辑
117浏览
2023-12-01

HTML5 的应用缓存(application cache),或者简称为appcache,是专门为开发离线Web 应用而设计的。Appcache 就是从浏览器的缓存中分出来的一块缓存区。要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源。下面是一个简单的描述文件示例。

  • CACHE MANIFEST
  • #Comment
  • file.js
  • file.css

在最简单的情况下,描述文件中列出的都是需要下载的资源,以备离线时使用。

设置描述文件的选项非常多,本书不打算详细解释每一个选项。要了解这些选项,推荐读者阅读HTML5Doctor 中的文章“Go offline with application cache”,网址为http://html5doctor.com/go-offline-with-application-cache。

要将描述文件与页面关联起来,可以在<html>中的manifest 属性中指定这个文件的路径,例如:

<html manifest="/offline.manifest">

以上代码告诉页面,/offline.manifest 中包含着描述文件。这个文件的MIME 类型必须是text/cache-manifest①。

① 描述文件的扩展名以前推荐用manifest,但现在推荐的是appcache。

虽然应用缓存的意图是确保离线时资源可用,但也有相应的JavaScript API 让你知道它都在做什么。
这个API 的核心是applicationCache 对象,这个对象有一个status 属性,属性的值是常量,表示应用缓存的如下当前状态。

  • 0:无缓存,即没有与页面相关的应用缓存。
  • 1:闲置,即应用缓存未得到更新。
  • 2:检查中,即正在下载描述文件并检查更新。
  • 3:下载中,即应用缓存正在下载描述文件中指定的资源。
  • 4:更新完成,即应用缓存已经更新了资源,而且所有资源都已下载完毕,可以通过swapCache()来使用了。
  • 5:废弃,即应用缓存的描述文件已经不存在了,因此页面无法再访问应用缓存。

应用缓存还有很多相关的事件,表示其状态的改变。以下是这些事件。

  • checking:在浏览器为应用缓存查找更新时触发。
  • error:在检查更新或下载资源期间发生错误时触发。
  • noupdate:在检查描述文件发现文件无变化时触发。
  • downloading:在开始下载应用缓存资源时触发。
  • progress:在文件下载应用缓存的过程中持续不断地触发。
  • updateready:在页面新的应用缓存下载完毕且可以通过swapCache()使用时触发。
  • cached:在应用缓存完整可用时触发。

一般来讲,这些事件会随着页面加载按上述顺序依次触发。不过,通过调用update()方法也可以手工干预,让应用缓存为检查更新而触发上述事件。

applicationCache.update();

update()一经调用,应用缓存就会去检查描述文件是否更新(触发checking 事件),然后就像页面刚刚加载一样,继续执行后续操作。如果触发了cached 事件,就说明应用缓存已经准备就绪,不会再发生其他操作了。如果触发了updateready 事件,则说明新版本的应用缓存已经可用,而此时你需要调用swapCache()来启用新应用缓存。

EventUtil.addHandler(applicationCache, "updateready", function(){
    applicationCache.swapCache();
});

支持HTML5 应用缓存的浏览器有Firefox 3+、Safari 4+、Opera 10.6、Chrome、iOS 3.2+版Safari及Android 版WebKit。在Firefox 4 及之前版本中调用swapCache()会抛出错误。