Подтвердить что ты не робот

Назад в браузере не работает должным образом после использования pushState (в Chrome)

Я использую этот тип строки в ответе JS

if (history && history.pushState){
     history.pushState(null, null, '<%=j home_path %>');
}

но когда я нажимаю back в браузере, я вижу код JS ответа вместо предыдущей страницы.

Есть ли способ заставить кнопку "Назад" работать, чтобы она повторно запрашивала страницу последнего URL-адреса (до home_path как pushStated в?

Обновление

Я нашел this.. похоже, что у другой проблемы есть такая же проблема.. History.js не исправляет ее либо

Итак, чтобы подтвердить некоторые комментарии там.. Это происходит только в chrome

Что я думаю

Я думаю, что корень всего этого заключается в том, что popstate запрашивает один и тот же тип pushstate documentemtn (js response). Что нужно сделать, так это по запросу popstate html-ответ. Я просто не знаю, как

Дополнительные обновления:

видя http://railscasts.com/episodes/246-ajax-history-state, он упоминает, как использовать

 $(window).bind("popstate", function() {
      $.getScript(location.href);
    });

это решает проблему, но в соответствии с пониманием jQuery $.getScript() с помощью кэширования ajax будет добавляться отметки времени.., которые загрязняют URL-адрес. он не работает снова с тем же эффектом.

Кто-нибудь знает, как это решить?

Еще больше обновлений

Я отслеживал маршруты этой проблемы по всему интерфейсу и заканчивал с проблемой в chrome, которая указывает на проблему с рельсами (firefox works fine) и проблема в rails-ujs относительно того, не включая Vary Header в ответах

Пример можно найти здесь

4b9b3361

Ответ 1

В настоящее время я играю с

 response.headers['Vary'] = 'Accept'

который, кажется, решает проблему, сначала взгляните.

Если у кого-то есть такая же проблема, пожалуйста, проверьте ее и дайте мне знать

Ответ 2

Вам нужно добавить слушателя к событию 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 историю api.

Ответ 3

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

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

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

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

Ответ 4

Это случилось с моей синатрой и хром.

Решил его:

$.ajaxSetup({ cache: false });