HTML 5 Cache: window.applicationCache.abort(); не работает
Я работаю над небольшим мобильным 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 ответа
Вам не нужно оборачивать downloading
addEventListener
позвонить в window
load
событие, 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
будет использовать обновленный кеш, но только для новых запросов, скорее всего, у вас уже есть старые файлы на странице. Самый простой способ заменить старые активы новыми, это перезагрузить страницу. Вы можете сделать это автоматически, но это может помешать пользователю, лучше сообщить ему, что обновление готово, и предоставить кнопку для перезагрузки страницы.
Яффский ответ не работает. (по крайней мере, в хроме).
Appcache будет автоматически обновляться независимо от того, что мы делаем, поэтому единственный способ контролировать, когда клиент получает обновления с сервера, - это управлять каждым манифестом кэша для каждого клиента (для каждого браузера).
Браузер должен будет создать GUID BrowserID и сохранить его в localStorage. Когда он запрашивает манифест кэша, он должен включить browserID в URL. Когда сервер отправляет манифест кэша, он кэширует его на стороне сервера. Каждый последующий запрос манифеста возвращает кэшированную версию.
Когда пользователь нажимает кнопку Sync, браузер отправляет запрос Cache Bust, включающий в себя идентификатор браузера. Это заставляет следующий запрос Cache Manifest с этим BrowserID возвращать обновленный Manifest, а не кэшированную версию.