Этот вопрос может показаться странным, потому что большая часть времени popstate запускается синхронно, когда пользователи нажимают кнопку "Назад".
Однако спецификация W3C заявляет, что UA (браузеру) разрешено ставить в очередь popstate при истории обхода (см. пункт 14), т.е. popstate
запускается асинхронно (даже если URL-адрес изменился в данный момент).
Поставщики браузеров интерпретируют и реализуют эту спецификацию по-разному. Mozilla решает Firefox должен иметь возможность запускать popstate
до load
и по уважительным причинам, чтобы медленные изображения не блокировали popstate
.
Chrome/Safari решает иначе, и это приводит к нашей проблеме:
При управлении историей для веб-приложения часто желательно как можно скорее начать управление историей, например. на DOMContentLoaded
вместо load
. Но в свою очередь, пользователи не могут вернуться из любого pushState
, потому что все popstate
поставлены в очередь до load
.
Мы ищем советы о способах решения такого сценария. Я придумываю несколько:
- Lazyload изображения, поэтому
load
может срабатывать как можно скорее. - Блокировать пользовательский интерфейс до
load
. - Структура init на
load
вместоDOMContentLoaded
.
Есть ли лучшие решения?
Обновить: все становится некрасиво, когда есть ajax, который срабатывает перед load
, если эти запросы приводят к изменению DOM, а изменение DOM имеет некоторые изображения, load
задерживается до тех пор, пока те изображения загружаются/время ожидания, что означает, что popstate
поставлено в очередь еще дольше.
Обновление 2. Чтобы добавить простую демонстрацию для него, перейдите на страницу jsbin с хром и посмотрите popstate
будет заблокирован до тех пор, пока load
не будет запущен. Вы можете сравнить результат между кэшированным изображением и нераскрытым изображением.