Встраивание Google Maps в страницу отключает bfcache (я буду использовать термин mozilla для отсутствия стандартного), поскольку страница карт, загруженная в <iframe>
, использует прослушиватель unload
.
Возможные причины, по которым страница не кэшируется для быстрой обратной навигации в Firefox, перечислены в MDN: Использование кэширования Firefox 1.5 .Ваша проблема указана как «страница верхнего уровня содержит фреймы, которые не кэшируются», что сбивает с толку, я попытаюсь прояснить это позже.(Другие браузеры, вероятно, используют аналогичную эвристику, поскольку эти правила были разработаны, чтобы избежать взлома существующего контента - см. Также этот ответ , на него есть несколько ссылок.)
Правильный способ исправить это будетподружиться с кем-то в Google, а затем ворчать, пока он не удалит слушателя onunload
хотя бы со встроенных страниц карт.
В общем, вы никогда не должны полагаться на то, что bfcache работает или не работает для конкретной страницы.Это просто оптимизация для общего случая.Поскольку это оптимизация, ее можно отключить, например, когда в системе недостаточно памяти.Это также не будет работать, если пользователь перезапустит браузер перед возвратом или закроет вкладку и выберет «Отменить закрытие вкладки», как вы отметили в ошибке.
Вам следует либо восстановить состояние страницы из JSили пометить страницу как не кешируемую (используя заголовок HTTP).Первое, конечно, приводит к лучшему взаимодействию с пользователем.Предложение @ Адама Гента выглядит правильно, мне придется проверить, к какой проблеме Firefox он относится.
Причина, по которой bfcache работает так:
- Если браузер работаетобработчик onunload, затем восстанавливает страницу с помощью bfcache, страница может быть повреждена, поскольку сценарии часто удаляют прослушиватели событий в обработчике onunload (для «очистки», что на самом деле не требуется, за исключением старых версий IE)
- если браузеры перестали запускать обработчики
onunload
на странице на том основании, что пользователь может вернуться на страницу и хотели бы ее кешировать, авторы будут жаловаться. - , если страница вЕсли iframe не может быть кэширован, восстановление кэшированной внешней страницы и перезагрузка внутренней страницы иногда могут их сломать (например, если обе страницы имеют одинаковый домен, внешняя страница может содержать ссылки на объекты во фрейме, которые не будут действительны послевнутренняя рамка перезагружается).Так что если iframe не кэшируется, то и родительская страница не является.
Причина, по которой страница все еще загружается из (дискового) кэша при нажатии «назад», заключается в том, что вы предположительно указали, что содержимоеВы отправили в браузер может быть кэширован.Браузер не может знать, что вы обновляете страницу на сервере параллельно с внесением в нее изменений в DOM.
Надеюсь, это поможет.
[править] Я будууточните идею «пометить страницу как не кешируемую» выше.Чтобы кеш веб-браузера работал, а не против вас, важно помнить, что HTTP - это протокол для извлечения ресурсов.Например, HTML-страница, идентифицируемая по URL http://bbb.akshell.com/broken, является ресурсом.Когда вы обслуживаете ресурс по HTTP, вы указываете, как долго будет действительна копия ресурса в браузере (т. Е. Соответствует канонической версии ресурса на сервере).
Когда, как и в вашем тестовом примере, ресурсHTML-страница с выбранным пользователем элементом, размеченным особым образом, ресурс может измениться в любое время (каждый раз, когда пользователь меняет выбор).Это означает, что честный HTTP-ответ при обслуживании этого ресурса будет «не кешировать, может измениться в любое время».Затем браузер будет перезагружать страницу с сервера каждый раз, когда ему нужно будет загрузить страницу - правильное поведение, но за счет медлительности для пользователя.
Альтернативный подход, подходящий для таких вещей, как переключение между несколькими вкладками на странице, состоит в том, чтобы связать каждый выбор с его собственным URL. Страница с двумя вкладками будет соответствовать двум ресурсам (и двум URL-адресам) - по одному для каждой вкладки. Оба ресурса могут быть (HTTP-) кэшированы браузером. Изменение URL-адреса и содержимого страницы может быть реализовано без обратной передачи на сервер через pushState.
Другой подход, который кажется более применимым к вашему случаю, в котором вы сохраняете ввод пользователя на сервере: разделите пользовательский интерфейс приложения и данные пользователя на разные ресурсы (например, статическую (HTTP-) кешируемую HTML-страницу с JS, загрузка пользовательских данных с отдельного не кешируемого URL). Запрос данных пользователя и обновление пользовательского интерфейса при загрузке. [/ Edit]