2013-03-13 4 views
21

Я использую этот тип линии в ответ JSкнопку назад в браузере не работает должным образом после использования PushState (в Chrome)

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

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

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

Update:

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

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

Что я думаю

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

Больше обновлений:

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

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

это решает но в соответствии с understanding jQuery $.getScript() withtout ajax caching добавит отметки времени .., который загрязняет URL-адрес. Отключение его делает его неработоспособным с тем же эффектом.

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

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

Я разыскал следы этой проблемы во всей межсети и заканчивались issue in chrome что указует на вопрос рельсов (светлячок однако работает отлично) и issue in rails-ujs относительно не включая Вары заголовка в ответов

Пример можно найти here

+1

ли вы предоставить полный исходный код и выход? Правильный блок кода, который вы указали. Мне нужна дополнительная информация, чтобы помочь решить вашу проблему. –

+1

В какой строке находится '' <% = j home_path%> ''result? – Simon

+0

это приводит к '/ home' –

ответ

10

Сейчас я играю с выполнением

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

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

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

+2

Thankx, этот заголовок решил мой проблема тоже. Это была необычная проблема, в которой я не испытывал этой проблемы, но мой шведский клиент сделал это. В apache этот заголовок можно настроить таким образом. Надеюсь, это полезно для тех, кто имеет ту же проблему. В .htaccess напишите следующий код ' Header append Vary: Accept ' –

+2

Вы спасли мне жизнь. – clime

+0

Что это значит? – Meliborn

0

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

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

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

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

+0

Обратите внимание, что' <% = j home_path%> 'находится в erb, поэтому после предварительной обработки он будет равен допустимому пути. возможно, я должен сделать полный путь –

+0

Я не знаю, я пробовал его локально, и он работал бы, только если я использовал файл: // путь. Все, что находится за пределами локального домена, не будет работать. Я думаю, что проверить, что у вас нет ошибок в системе безопасности, это первое, что вы можете использовать инструкцию 'try ... catch'. – Okarin

+0

В какой версии FF вы используете @Okarin? Приведенный код отлично работает для меня в FF19. – Simon

6

Вы должны добавить слушателя к popstate событию

window.onpopstate = function(event) { 
    //load the page 
}; 

Когда кнопка нажата назад URL-адрес изменяется, и затем popstate событие. Вы несете ответственность за загрузку деталей в своем прослушивателе popstate, который соответствует измененному URL-адресу.

A nice popstate example

Некоторые браузеры огонь popstate событие при первой загрузке страницы, вызывая бесконечный цикл загрузки страницы. Этого можно избежать, добавив следующую проверку

var loadPage = window.history.state; 
window.onpopstate = function(event) { 
    if (loadPage) 
     //load the page 
}; 

Затем установить loadPage истина, когда PushState называется

history.pushState(null, null, '<%=j home_path %>'); 
loadPage = true; 

Этот метод работает во всех браузерах, которые поддерживают истории html5 API.

+0

это не работает .. поскольку скрипт, загружающий страницу, вызывает бесконечный цикл, так как каждый раз, когда вы загружаете страницу, она снова называется popstate. –

+0

@NickGinanto. Я отредактировал свой ответ, чтобы избежать вашей проблемы с бесконечным циклом. –

0

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

решаемые его:

$.ajaxSetup({ cache: false }); 
+0

Я пробовал это, но он добавляет уродливую метку времени к url ​​ –

+0

Странно, хотя в консоли я вижу, как ajax xhr запрашивает timestamped url, он не отображается в строке url браузера. Вы можете попытаться снять временную метку с вашего имени, которое вы сохранили на pushstate. – Trompa

+0

Спасибо! Я попробовал много решений, но этот был единственным для меня. 100 баллов за вас – 2013-05-15 10:18:20

 Смежные вопросы

  • Нет связанных вопросов^_^