кнопка Назад в браузере не работает должным образом после использования pushState (в Хроме)
Я использую этот тип строки в ответе JS
if (history && history.pushState){
history.pushState(null, null, '<%=j home_path %>');
}
но когда я нажимаю back
в браузере я вижу код JS ответа вместо предыдущей страницы.
есть ли способ заставить кнопку "Назад" работать, чтобы она повторно запросила страницу последнего url-адреса (до home_path
как pushStated в?
обновление:
Я нашел этой.. кажется, у других такая же проблема.. История.js не исправляет это либо
так, чтобы подтвердить некоторые из комментариев там.. Это происходит только в Chrome
что я думаю
Я думаю, что корень всего этого заключается в том, что popstate запрашивает тот же тип документа pushstate (ответ js). То, что нужно сделать, - это запрос popstate на ответ html.. Я просто не знаю как!--5-->
больше обновлений:
видя http://railscasts.com/episodes/246-ajax-history-state он упоминает использовать
$(window).bind("popstate", function() {
$.getScript(location.href);
});
это решает проблему, но по данным понимание jQuery с $.getScript() без кэширования ajax он добавит временные метки.. что загрязняет url.. выключение делает его не работать снова с тем же эффектом..
кто-нибудь знает как решить это?
еще больше обновлений
я отслеживал следы проблемы по всей паутине и заканчивалось на проблема в chrome что указывает на проблему rails (firefox работает отлично, однако) и выпуск в rails-ujs относительно не включая заголовок Vary в ответах
пример можно найти здесь
4 ответов
в настоящее время я играю с doing
response.headers['Vary'] = 'Accept'
что, кажется, решает проблему, на первый взгляд.
Если у кого-то есть такая же проблема, пожалуйста, проверьте его и дайте мне знать
вам нужно добавить прослушиватель к событию popstate
window.onpopstate = function(event) {
//load the page
};
при нажатии кнопки "Назад" url-адрес изменяется, а затем запускается событие popstate. Вы несете ответственность за загрузку сведений в прослушивателе popstate, соответствующих измененному url-адресу.
некоторые браузеры запускают событие popstate при первой загрузке страницы, вызывая бесконечный цикл загрузки страницы. Этого можно избежать, добавив следующее проверка
var loadPage = window.history.state;
window.onpopstate = function(event) {
if (loadPage)
//load the page
};
затем установите loadPage в true, когда pushState вызывается
history.pushState(null, null, '<%=j home_path %>');
loadPage = true;
этот метод работает во всех браузерах, поддерживающих html5 history api.
я протестировал этот код в своем браузере, используя локальный HTML-файл, и я получил ошибку безопасности консоли:
SecurityError: The operation is insecure.
history.pushState(null, null, '<%=j home_path %>');
Я вижу, как манипулирование историей браузера может считаться потенциально опасным поведением, поэтому я думаю, вы должны проверить, что это не происходит и для вас. Попробуйте использовать консоль Javascript Firebug. Также возможно, что могут быть различия в поведении между локальными и http:// HTML-файлами.
сказал это, за то, что я видел последний элемент history
array-это в основном текущая страница, поэтому, если вы хотите изменить предыдущую, вы можете сделать это с помощью двух команд pushState () - сначала вы нажимаете предыдущий элемент, который вы хотите, а затем снова нажимаете текущий путь. Если я правильно понял вашу проблему.