«Открыть последнюю закрытую вкладку», чтобы отобразить содержимое последнего запроса ajax - PullRequest
7 голосов
/ 25 февраля 2012

Я использую HTML 5 истории API для сохранения состояния, когда происходят запросы AJAX, и я предоставляю полный HTML-контент, если пользовательский запрос на той же странице без запроса AJAX.

Функция «Повторно открыть последнюю закрытую вкладку» браузера обеспечивает доставку содержимого последнего запроса AJAX без обращения к серверу. Если бы браузер запрашивал, не принося содержимое последнего запроса, то все работало бы без проблем. Но браузер просто показывает содержимое последнего запроса ajax.

Я испытал это на Chrome 17, Firefox 10. (Я не пробовал на ie9, потому что у него нет API истории поддержки)

Какое решение этой проблемы известно?

Edit: эти запросы AJAX просто "получить" запрос к серверу.

действительно невозможно продемонстрировать это в jsfiddle.net по нескольким причинам. Вы можете продемонстрировать это на своем локальном хосте, как показано ниже.

Сделайте запрос "get" на сервер и извлеките объекты json, затем вставьте этот URL в историю API, как показано ниже.

history.pushState(null,null,url);

Затем закройте эту вкладку и нажмите кнопку «Открыть последнюю закрытую вкладку» в своем браузере. Что ты видишь ? Json тело ответа? Браузер показывает это без запроса к серверу, верно?

Ответы [ 3 ]

5 голосов
/ 28 февраля 2012

Проблема была вызвана заголовками ответа http. Заголовки содержали кешируемую информацию для запросов ajax, поэтому браузер показывал, что URL-адрес контента из кеша не попадал в базу данных.

После удаления параметров кэша из заголовков ответов браузер смог подключиться к серверу без извлечения содержимого из кэша.

1 голос
/ 05 октября 2015

Когда вы снова открываете закрытую вкладку, браузер может повторно использовать данные из кэша для данного URL-адреса для заполнения окна. Поскольку данные в кэше взяты из ответа на запрос ajax, это то, что он использует, и вы видите JSON.

Так что возникает вопрос: почему браузер не использовал HTML из кэша при выполнении запроса ajax? Браузеры используют разные правила, чтобы определить, следует ли использовать кэшированный контент в зависимости от того, что они делают. В этом случае кажется, что Chrome с удовольствием использует его при восстановлении недавно закрытой вкладки, а не при выполнении запроса ajax.

Вы можете исправить это, сказав браузеру никогда кэшировать ответ. Желательно ли это, зависит от вашего варианта использования.

Например, вставка их в верхнюю часть вашего файла (конечно, после открывающего тега <?php) делает меня невозможным:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
0 голосов
/ 26 февраля 2012

Все зависит от того, какой браузер вы используете, и какие оптимизации включены.

Например, Google Chrome сохранит страницу в памяти, поэтому, когда вы выполняете ответный удар и переходите на новый сайт, или когдаВы снова открываете закрытую вкладку - она ​​восстановит страницу из памяти.

Старые или более медленные браузеры просто обновят что-либо.

Хотя это не должно быть проблемой, как ваш JavaScriptсостояние также должно быть восстановлено - оно должно быть точно таким же во всех отношениях, когда они заново открывают эту страницу.

...