Как обращаться с кнопкой возврата, когда браузер не запускает всплывающее событие сразу
Этот вопрос может показаться странным, потому что большая часть времени 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
не будет запущен. Вы можете сравнить результат между кэшированным изображением и нераскрытым изображением.
Ответы
Ответ 1
Можете ли вы попытаться вызвать popstate во время разгрузки предыдущей страницы. Например, если вы находитесь на странице 1 и хотите перейти на страницу 2 вместо того, чтобы вызывать состояние pop во время загрузки/готовности страницы 2, почему бы вам не вызвать состояние pop в событии разгрузки страницы 1?
Не уверен, удовлетворяет ли он вашему сценарию. Но я не смог попробовать его в корзине.