кнопка Назад в браузере не работает должным образом после использования 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

некоторые браузеры запускают событие 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.


это случилось с sinatra & chrome.

решил это с помощью:

$.ajaxSetup({ cache: false });

я протестировал этот код в своем браузере, используя локальный HTML-файл, и я получил ошибку безопасности консоли:

SecurityError: The operation is insecure.
  history.pushState(null, null, '<%=j home_path %>');

Я вижу, как манипулирование историей браузера может считаться потенциально опасным поведением, поэтому я думаю, вы должны проверить, что это не происходит и для вас. Попробуйте использовать консоль Javascript Firebug. Также возможно, что могут быть различия в поведении между локальными и http:// HTML-файлами.

сказал это, за то, что я видел последний элемент history array-это в основном текущая страница, поэтому, если вы хотите изменить предыдущую, вы можете сделать это с помощью двух команд pushState () - сначала вы нажимаете предыдущий элемент, который вы хотите, а затем снова нажимаете текущий путь. Если я правильно понял вашу проблему.