2012-11-27 50 views
4

我正在使用离线模式在一个小的移动WebApp上工作。 如果清单文件已更改,是否有任何方法可以防止自动更新?如果用户的互联网连接不好,他不应该被迫下载所有文件,但应该会收到一条消息,以便稍后更新文件。HTML 5 Cache:window.applicationCache.abort();不起作用

我试图

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. 
} 

回答

1

你不需要来包装你downloadingaddEventListener中的呼叫windowload事件, applicationCache对象从一开始就在那里。

您正在倾听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将使用更新后的缓存,但仅适用于新请求,很可能您已获得页面上较旧的文件。用新的替换旧资产的最简单方法是重新加载页面。您可以自动执行此操作,但这可能会对用户造成破坏性,最好告诉他们准备好了更新,并提供一个按钮来重新加载页面。

+0

以上是根​​据规范,我没有在浏览器中测试它。 –

2

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

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

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

当用户按下“同步”按钮时,浏览器会发送一个包含浏览器ID的缓存胸围请求。这会导致带有该BrowserID的下一个缓存清单请求返回更新的清单,而不是缓存的版本。