JavaScript. Подробное руководство, 6-е издание, стр. 341

<b>CACHE MANIFEST</b>

<b># МуАрр версия 1 (изменяйте этот номер, чтобы заставить броузеры повторно</b>

<b># загрузить следующие файлы)</b>

<b>MyApp.html</b>

<b>МуАрр.js</b>

Аналогично, если потребуется, чтобы веб-приложение удалило себя из кэша приложений, следует удалить файл объявления на сервере, чтобы на запрос этого файла возвращался бы НТТР-ответ 404 «Not Found», и изменить HTML-файл или файлы, удалив из них ссылки на файл объявления.

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

В ходе обновления кэша броузер запускает множество событий, что дает возможность зарегистрировать их обработчики и извещать пользователя. Например:

<b>applicationCache.onupdateready = function() {</b>

<b>  var reload = confirm(&quot;Доступна новая версия приложения, которая\n” +</b>

<b>                     &quot;будет использована при следующем запуске.\n&quot; +</b>

<b>                     &quot;Хотите ли перезапустить ее сейчас?&quot;);</b>

<b>  if (reload) location.reload();</b>

<b>}</b>

Обратите внимание, что этот обработчик событий регистрируется в объекте

<b>ApplicationCache</b>
, на который ссылается свойство
<b>applicationCache</b>
объекта
<b>Window</b>
. Броузеры, поддерживающие кэш приложений, определяют это свойство. Помимо события «updateready», показанного выше, существует еще семь различных событий, имеющих отношение к кэшу приложений. В примере 20.4 демонстрируются простые обработчики, которые выводят сообщения, информирующие пользователя о ходе обновления кэша и о его текущем состоянии.

Пример 20.4. Обработка событий кэша приложений

<b>// Эту функцию используют все обработчики событий, реализованные ниже, и выводят </b>

<b>// с ее помощью сообщения, информирующие о состоянии кэша приложений.</b>

<b>// Поскольку все обработчики отображают сообщения таким способом, они </b>

<b>// возвращают false, чтобы отменить дальнейшее распространение события </b>

<b>// и предотвратить вывод сообщений самим броузером, </b>

<b>function status(msg) {</b>

<b>  // Вывести сообщение в элементе документа с id=&quot;statusline&quot;</b>

<b>  document.getElementById(&quot;statusline&quot;).innerHTML = msg;</b>

<b>  console.log(msg); // А также в консоли для отладки</b>

<b>}</b>

<b>// Каждый раз, когда приложение загружается, броузер проверяет файл объявления. </b>

<b>// В начале этого процесса первым всегда генерируется событие &quot;checking&quot;, </b>

<b>window.applicationCache.onchecking = function() {</b>

<b>  status(&quot;Проверка наличия новой версии.&quot;);</b>

<b>  return false;</b>

<b>};</b>

<b>// Если файл объявления не изменился и приложение уже имеется в кэше, </b>

<b>// генерируется событие &quot;noupdate&quot; и процедура проверки заканчивается, </b>

<b>window.applicationCache.onnoupdate = function() {</b>

<b>  status(&quot;Версия приложения не изменилась.&quot;)</b>

<b>  return false;</b>

<b>};</b>

<b>// Если приложение отсутствует в кэше или если изменился файл объявления,</b>

<b>// броузер загрузит и поместит в кэш все, что перечислено в файле объявления. </b>

<b>// Событие &quot;downloading&quot; свидетельствует о начале этой процедуры загрузки, </b>

<b>window.applicationCache.ondownloading = function() {</b>

<b>  status(&quot;Загружается новая версия&quot;);</b>

<b>  window.progresscount = 0; // Используется в обработчике &quot;progress&quot; ниже</b>

<b>  return false;</b>

<b>};</b>

<b>// В ходе загрузки периодически генерируются события &quot;progress”,</b>

<b>// обычно после загрузки каждого файла.</b>

<b>window.applicationCache.onprogress = function(e) {</b>

<b>  // Объект события должен соответствовать событию &quot;progress&quot; (подобному тому, </b>

<b>  // что используется XHR2), что позволяет вычислять процент выполнения,</b>

<b>  // но на всякий случай мы заведем счетчик количества вызовов,</b>

<b>  var progress = &quot;&quot;;</b>

<b>  if (е &amp;&amp; е.lengthComputable) // Событие &quot;progress&quot;: вычислить процент</b>

<b>    progress = &quot; &quot; + Math.round(100*e.loaded/e.total) + &quot;%”</b>

<b>  else // Иначе сообщить кол-во вызовов</b>