Поток событий

Автор: Евгений Рыжков и Татьяна Головко Дата публикации: 04.04.2011

До этого я писал об оффлайновом веб приложении, сохранении manifest, сохранной версии приложения (appcache) немного расплывчато. Загружаются элементы, браузер принимает решение и все «просто работает». Но нам как веб-разработчикам по привычке мало «просто работает».

Во-первых, поговорим о потоке событий, в частности о DOM событиях. Когда твой браузер заходит на страницу, на которой есть указатель на файл manifest, происходит ряд событий объекта window.applicationCache, которые я опишу ниже. Все это может показаться сложным, но я, как только мог, старался расписать все максимально просто. Вот эти процессы:

  1. Как только замечен атрибут manifest у тега <html>, в браузере срабатывает событие checking. Все упомянутые тут события связаны с объектом window.applicationCache. Событие checking происходит независимо от того, была ли ранее посещена данная страница или любая другая, которая указывает на один и тот же manifest.
  2. Если браузер до этого не встречал данный manifest:
    • сработает событие downloading, которое означает начало загрузки ресурсов, перечисленных в manifest;
    • во время загрузки ресурсов будет периодически срабатывать событие progress, которое содержит информацию о том, какие файлы уже загружены, а какие еще ожидают загрузки;
    • после того, как все ресурсы, перечисленные в manifest, успешно загружены, сработает финальное событие — cached. Это сигнал о том, что оффлайновое приложение полностью загружено и готово к использованию в автономном режиме.
  3. С другой стороны, если вы уже посещали страницу, на которой есть указатель на уже известный браузеру файл manifest то, возможно, перечисленные в нем ресурсы уже присутствуют в appcache. Или даже оффлайновое приложение сохранено полностью. Теперь вопрос в том, изменился ли кеш manifest с момента последнего посещения браузером и как это проверить?
    • Если ответ — нет, тогда кеш не изменился. В этом случае сработает событие noupdate.
    • Если ответ — да, тогда кеш изменился. В этом случае сработает событие downloading и будет начато пересохранение каждого ресурса, указанного в файле manifest.

    Пока будет идти загрузка, будет периодически срабатывать событие progress, в котором содержится информация сколько ресурсов уже закачалось и сколько еще ждет своей очереди.

    После того, как все ресурсы перечисленные в manifest успешно загружены, сработает событие updateready. Это означает, что обновление файлов завершено и приложение готово к использованию в автономном режиме. Но новая версия все еще не используется. Для «горячего переключения» к новой версии, не заставляя пользователя перезагружать страницы, можно вызвать функцию window.applicationCache.swapCache().

Если в любой момент этого процесса что-то пойдет не так, сработает событие error и процесс будет остановлен. Вот пример некоторых моментов, которые могут «пойти не так»:

  • manifest возвращает HTTP-ошибку 404 (файл не найден) или 410 (файл перенесен навсегда);
  • manifest был найден и он не был изменен, но HTML страницу, которая указывает на manifest, не удалось загрузить;
  • manifest был найден и он не был изменен, но не удалось загрузить один из ресурсов, указанных в нем.

Куда дальше