HTML 5缓存:window.applicationCache.abort();不起作用

时间:2012-11-27 20:21:27

标签: html5 html5-appcache

我正在使用离线模式处理一个小型移动WebApp。 如果清单文件已更改,有没有办法阻止自动更新?如果用户的互联网连接不良,则不应强迫他下载所有文件,但应该收到一些消息,以便他以后可以更新文件。

我试过

window.addEventListener('load', function(e) {    
  window.applicationCache.addEventListener('ondownloading', function(e) {
      window.applicationCache.abort();
  }, false);
}, false);

但它不起作用。在Safari 6.0.2和Chrome Canary中都没有。

应用程序只应在用户使用以下代码手动点击“更新”按钮时更新文件:

var appCache = window.applicationCache;
appCache.update();

if (appCache.status == window.applicationCache.UPDATEREADY) {
  appCache.swapCache();  // The fetch was successful, swap in the new cache.
}

2 个答案:

答案 0 :(得分:2)

雅法的回答不起作用。 (至少在铬中)。

无论我们做什么,appcache都会自动更新,因此控制客户端何时从服务器获取更新的唯一方法是在每个客户端(每个浏览器)的基础上管理每个缓存清单。

浏览器需要创建一个BrowserID GUID并将其存储在localStorage中。当它请求缓存清单时,它应该在URL中包含browserID。当服务器发送缓存清单时,它会将其缓存在服务器端。每个后续的清单请求都会返回缓存版本。

当用户按下Sync按钮时,浏览器发送包含浏览器ID的Cache Bust请求。这会导致具有该BrowserID的下一个Cache Manifest请求返回更新的Manifest,而不是缓存的版本。

答案 1 :(得分:1)

您无需在downloading addEventListener事件中包含window load来电,applicationCache对象就在那里。< / p>

您正在侦听ondownloading事件,但没有名为该事件的事件,您不需要on

但是,您可能希望通过checking事件更快地捕获更新过程。您也不必致电abort,因为checking事件可以取消。

var blockUpdates = true;

window.applicationCache.addEventListener('updating', function(event) {
    if (blockUpdates) {
        event.preventDefault();
    }
}, false);

function updateButtonPressed() {
    blockUpdates = false;
    window.applicationCache.update();
}

window.applicationCache.addEventListener('updateready', function() {
    // but what do we do here?
}, false);

但是当你有更新时你应该怎么做? swapCache将使用更新的缓存,但仅针对新请求,您可能已经在页面上获得了较旧的文件。用new替换旧资产的最简单方法是重新加载页面。您可以自动执行此操作,但这可能会对用户造成干扰,最好告诉他们已准备好更新,并提供重新加载页面的按钮。