История HTML5: проблемы с кнопкой "Назад" после полной загрузки страницы

Я создаю веб-приложение, которое использует AJAX и историю HTML5 (с запасным вариантом для старых браузеров, history.js < / а>).

Только часть моего приложения загружается через фоновый javascript (часть, которая довольно тяжелая и будет использоваться большую часть времени). На другие страницы можно попасть по обычным ссылкам, и при загрузке этих страниц произойдет полная перезагрузка страницы.

Когда я немного перемещался по динамической части (URL-адрес изменяется и соответствует отображаемому контенту), оставил его через обычную ссылку, а затем нажал кнопку возврата в браузере, происходит что-то странное: только та часть, которая была загружена в последний XHR (в моем случае div, содержащий некоторые данные) отображается без макета и css. Когда я смотрю на источник (в Chromium и FF + Firebug), DOM состоит только из указанного div.

Я ожидал, что браузер либо кэширует DOM и другую информацию, чтобы он мог восстановить предыдущую страницу, либо перезагрузит последний URL-адрес (страница будет отображаться, как ожидалось, потому что, если она не загружена через XHR, она будет отображаться в макете). Я пытался установить заголовки управления кешем в ответ на XHR, но это не помогло.

Я собрал минимальный пример: http://moserei.de/html5_history/

Спасибо за помощь!


person Martin Vielsmaier    schedule 12.09.2011    source источник
comment
пример - 404. Не могли бы вы загрузить файлы на github или что-то в этом роде? Надеюсь, они у вас все еще есть.   -  person luckydonald    schedule 18.01.2017


Ответы (1)


Это конфликт имен:

Исходная страница имеет 2 состояния и занимает 2 URL:

  1. http://moserei.de/html5_history/
  2. http://moserei.de/html5_history/xhr.html

Запрос XHR для http://moserei.de/html5_history/xhr.html имеет другой ответ, чем исходная страница. Теперь этот URL http://moserei.de/html5_history/xhr.html связан с двумя вещами:

  1. Состояние в исходном URL
  2. Разделенный контент, отправленный через XHR

Что должен делать браузер, когда ему нужно получить этот URL-адрес из кеша (при нажатии кнопки «Назад»)? Сложно сказать. Я не уверен, есть ли четко определенное правило в спецификации истории, поэтому постарайтесь этого избежать.

person Cat Chen    schedule 13.09.2011
comment
Вы правы, URL http://moserei.de/html5_history/xhr.html означает две разные вещи. Но, на мой взгляд, браузер никогда не должен напрямую отображать контент, загруженный через XHR. Поэтому он должен пытаться регулярно перезагружать его, что он и делает, когда заголовки в ответе на XHR запрещают кеширование (см. Мой собственный ответ). - person Martin Vielsmaier; 13.09.2011
comment
Что, если пользователь перейдет на /xhr.html через AJAX, а затем обновит страницу? Пользователь ожидает, что будет показан тот же контент. Таким образом, когда вы используете History API для переключения между URL-адресами, обычно вы гарантируете, что каждый URL-адрес доступен как через изменение состояния AJAX, так и через запрос полной страницы. - person Cat Chen; 15.09.2011