Подтвердить что ты не робот

Как обращаться с кнопкой возврата, когда браузер не запускает всплывающее событие сразу

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

4b9b3361

Ответ 1

Можете ли вы попытаться вызвать popstate во время разгрузки предыдущей страницы. Например, если вы находитесь на странице 1 и хотите перейти на страницу 2 вместо того, чтобы вызывать состояние pop во время загрузки/готовности страницы 2, почему бы вам не вызвать состояние pop в событии разгрузки страницы 1?

Не уверен, удовлетворяет ли он вашему сценарию. Но я не смог попробовать его в корзине.