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 ответа

Решение

Вам не нужно оборачивать 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 будет использовать обновленный кеш, но только для новых запросов, скорее всего, у вас уже есть старые файлы на странице. Самый простой способ заменить старые активы новыми, это перезагрузить страницу. Вы можете сделать это автоматически, но это может помешать пользователю, лучше сообщить ему, что обновление готово, и предоставить кнопку для перезагрузки страницы.

Яффский ответ не работает. (по крайней мере, в хроме).

Appcache будет автоматически обновляться независимо от того, что мы делаем, поэтому единственный способ контролировать, когда клиент получает обновления с сервера, - это управлять каждым манифестом кэша для каждого клиента (для каждого браузера).

Браузер должен будет создать GUID BrowserID и сохранить его в localStorage. Когда он запрашивает манифест кэша, он должен включить browserID в URL. Когда сервер отправляет манифест кэша, он кэширует его на стороне сервера. Каждый последующий запрос манифеста возвращает кэшированную версию.

Когда пользователь нажимает кнопку Sync, браузер отправляет запрос Cache Bust, включающий в себя идентификатор браузера. Это заставляет следующий запрос Cache Manifest с этим BrowserID возвращать обновленный Manifest, а не кэшированную версию.

Другие вопросы по тегам