我正在使用离线模式处理一个小型移动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.
}
答案 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替换旧资产的最简单方法是重新加载页面。您可以自动执行此操作,但这可能会对用户造成干扰,最好告诉他们已准备好更新,并提供重新加载页面的按钮。