2012-06-16 2 views
-1

У меня есть приложение HTML5, которое управляет историей браузера, чтобы показать правильный URL-адрес для вызовов Ajax. Это отлично работает, но проблема возникает, когда мое приложение имеет гиперссылку на внешний сайт, скажем http://www.google.com. Когда это происходит, история выглядит следующим образом:История HTML5, кнопка «Назад» и внешние ссылки

My App Страница А -> My App Страница B -> Google

Когда пользователь нажимает кнопку один раз, все нормально. Отображается страница моего приложения B.

Но когда пользователь дважды нажимает кнопку «Назад», URL-адрес изменяется, но страница не изменяется. Мое приложение не может сделать правильный вызов Ajax, чтобы показать состояние для моей страницы приложения А, потому что обработчик onpopstate так и не получил вызов. Это связано с тем, что обработчик не был инициализирован, когда браузер вернулся к странице «Мое приложение» (никаких событий не было в этом событии), поэтому я не могу повторно инициализировать обработчик.)

Это опыт работы с Chrome, но я не имеют оснований полагать, что это зависит от Chrome. Есть ли способ обойти эту проблему?

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

+1

Вы должны использовать обработчик onload в дополнение к обработчику popstate, и вам может понадобиться некоторый обработчик выгрузки (http://stackoverflow.com/questions/158319/cross-browser-onload-event-and-the- back-button), чтобы разбить кеш браузера. – user123444555621

+0

Я не понимаю, почему 'onpopstate' так и не получил. Его следует вызывать каждый раз, когда пользователь меняет местоположение. –

ответ

1

Ссылка, предоставленная @ Pumbaa80, поставила меня на правильный путь.

Если вы положили на свою страницу <body onunload="">, тогда происходит перерыв bfcache в Chrome и других браузерах. Это означает, что когда вы нажмете кнопку «Назад», чтобы вернуться в «Моя страница приложения B» от Google, все события JavaScript на странице будут запускаться.

Невозможно получить onpopstate, чтобы получить вызов на странице моего приложения B после возвращения из Google. (Это будет нелогично, так как это событие срабатывает только на странице, где вы нажимаете кнопку «Назад»).

Альтернативой является выполнение логики при загрузке My App Page B. Разбив bfcache, как описано выше, загорится jQuery dom. Запустив аналогичный код из onpopstate в обратном вызове jQuery dom, я могу получить доступ к данным, хранящимся в объекте History, для сброса состояния моего веб-приложения HTML5 после возврата с внешней страницы.

0

Думаю, вам нужно использовать хеш-теги, чтобы сохранить состояние вашей страницы, я не вижу способа обойти это. Я делал это в прошлом с большим успехом, используя this jQuery plugin, с очень модным именем BBQ (Back Button & Query library). Это позволит вашей странице выполнять действия на основе хеш-тегов в URL-адресе.

+0

Похоже, вы не знаете о том, что push5State555 может сохранить состояние: https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#The_pushState().C2.A0method –

+0

@Derek: Это выглядит великолепно, спасибо за возглавляет, определенно будет использовать это в будущем. Тем не менее, я вижу, что поддержка для него пока не оптимальна, но отсутствует IE9 и ниже которой приходится много трафика. Ссылка: http://caniuse.com/#search=pushState - Мое решение может по крайней мере служить резервным. – ohaal

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