关于html5的cache-manifest缓存失败的几点观察

时间:2020-12-23 08:06:04

我在参考了以下文章(http://kayosite.com/web-app-by-jquery-mobile-and-html5-offline-web-applications.html)后,做了实践,发现以下几点:

1、对于php文件,有header("Location:xxxxxxxx");的。无法缓存,缓存到这个文件会出错,缓存停止,后面的文件都缓存不了。

2、js脚本出错的无法缓存,但不知道是js文件无法缓存还是引用它的html文件无法缓存。

3、对于用来跳转的的html文件,比如包含document.location = 'xxx';的,无法缓存。必须手动才能缓存,例如

<script>
try{window.applicationCache.update();}catch(e){}
document.location = 'xxx';
  </script>

对于safari,这个才能用:

<script>
setTimeout("document.location = 'xxx'",100);
  </script>

4、(这条实在Safari上实验得出的)目前发现window.applicationCache触发的事件有以下几种顺序:

(1)checking->error(html文件的<html>标签的manifest属性指向的文件不存在)

(2)checking->downloading->cached(没有离线缓存时发生,表示离线缓存下载完成。但在其他时候好像有观察到偶然发生,无法解释。)

(3)checking->noupdate(检测到服务器上的manifest文件内容未发生变化,使用了之前的离线缓存)

(4)checking->downloading->updateready(存在离线缓存,浏览器载入并显示之前离线缓存,然后检测到服务器上的manifest文件内容发生了变化,于是更新了离线缓存。值得注意的是,这种情况下,浏览器只载入并显示之前未更新的离线缓存,然后再更新离线缓存,不再显示更新后的离线缓存,所以需要手动更新)

(5)checking->error(未联网)

另外,用了以下代码,保证修改服务器端代码后,浏览器能实时反映改变:

function cacheManifestCheck(){
window.applicationCache.addEventListener('checking', function(){
        //alert('检查相关联的 manifest 文件是否存在');
    }, true);
window.applicationCache.addEventListener('noupdate', function(){
var isFromUpdateReady=sessionStorage.getItem("fromUpdateReady");
if(isFromUpdateReady){
sessionStorage.removeItem("fromUpdateReady");
$("#isUsedCacheManifest").text("本页面是从网上下载的");
}else{
//alert('检测到 manifest 没有更新');
$("#isUsedCacheManifest").text("本页面载入离线缓存");
}
    }, true);
window.applicationCache.addEventListener('downloading', function(){
        //alert('缓存下载');
$("#isUsedCacheManifest").text("页面发生更新,缓存中……");
    }, true);
window.applicationCache.addEventListener('cached', function(){
        //alert('cached');
$("#isUsedCacheManifest").text("本页面是从网上下载的");
    }, true);
window.applicationCache.addEventListener('updateready', function(){
        //alert('已根据 manifest 文件中指定的要求重新下载相应的资源');
sessionStorage.setItem("fromUpdateReady", true);
location.reload();
//$("#isUsedCacheManifest").text("本页面是从网上下载的");
    }, true);
window.applicationCache.addEventListener('obsolete', function(){
        //alert('manifest 文件请求发生 404 或 410 错误,该缓存已被删除');
$("#isUsedCacheManifest").text("manifest 文件请求发生 404 或 410 错误,该缓存已被删除");
    }, true);
window.applicationCache.addEventListener('error', function(){
        //alert('以下四种情况事件:1. manifest 文件请求发生 404 或 410 错误; 2. manifest 文件没有修改,但页面无法正确引用 manifest ;3. 根据 manifest 文件更新资源时发生致命错误(如上面提到的 InvalidStateError 错误);4. 当资源正在更新时 manifest 文件被修改。');
$("#isUsedCacheManifest").text("本页面载入离线缓存");
    }, true);
}