Ответ 1
В настоящее время я играю с
response.headers['Vary'] = 'Accept'
который, кажется, решает проблему, сначала взгляните.
Если у кого-то есть такая же проблема, пожалуйста, проверьте ее и дайте мне знать
Я использую этот тип строки в ответе 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 в ответах
Пример можно найти здесь
В настоящее время я играю с
response.headers['Vary'] = 'Accept'
который, кажется, решает проблему, сначала взгляните.
Если у кого-то есть такая же проблема, пожалуйста, проверьте ее и дайте мне знать
Вам нужно добавить слушателя к событию popstate
window.onpopstate = function(event) {
//load the page
};
Когда нажата кнопка "Назад", URL изменяется, а затем запускается событие popstate. Это ваша ответственность за загрузку деталей в вашем слушателе popstate, который соответствует измененному URL-адресу.
Некоторые браузеры запускают всплывающее событие, когда первая страница загружается, вызывая бесконечный цикл загрузки страницы. Этого можно избежать, добавив следующую проверку
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.
Я тестировал этот код в своем браузере, используя локальный файл HTML, и у меня возникла ошибка безопасности консоли:
SecurityError: The operation is insecure.
history.pushState(null, null, '<%=j home_path %>');
Я вижу, как манипулирование историей браузера можно считать потенциально опасным поведением, поэтому, я думаю, вы должны проверить, что это не происходит и для вас. Попробуйте использовать консоль Javascript Firebug. Также возможно, что могут быть различия в поведении между локальными и http://HTML файлами.
Сказано это, поскольку я видел последний элемент массива history
в основном по текущей странице, поэтому, если вы хотите изменить предыдущий, вы можете сделать это, используя две команды pushState() - сначала вы нажимаете предыдущий элемент, который вы желаете, затем вы снова нажимаете текущий путь. Если я правильно понял вашу проблему.
Это случилось с моей синатрой и хром.
Решил его:
$.ajaxSetup({ cache: false });