Это обычно делается либо с использованием новейших HTML5
истории API, или, для старых браузеров, изменяя хэш в URL-адресе. Посмотрите на эту статью: http://dev.opera.com/articles/view/introducing-the-html5-history-api/.
Когда какое-либо действие пользователя запрашивает новую страницу, вместо того, чтобы загружать новую страницу (с новым URL-адресом), страница сохраняет общие свойства (например, заголовок, нижний колонтитул или, скажем, на сайте электронной коммерции, виджет корзины покупок), а оставшееся содержимое выбирается асинхронно через Ajax
. После ввода нового контента пользовательский интерфейс изменяется соответствующим образом, а новый state
вставляется в стек Истории и соответственно меняет URL. С помощью атрибута data
, используемого здесь в качестве словаря, вы храните информацию о том, что показывать, когда пользователь перемещается вперед/назад и снова приходит на эту страницу. Что-то вроде этого:
history.pushState({mydata1: data, mydata2: anotherData},"newTitle",newURL);
Таким образом, когда пользователь нажимает кнопку Назад браузера, что запись просто выталкивается из стека истории, и из атрибутов данных новой записи в верхней части стека, то отображается новая страница.Текущая страница может быть обновлена, а также:
history.replaceState({mydata1: data, mydata2: anotherData}, "anotherTitle",newURL);
Вся информация относительно текущей страницы могут быть получены из state
:
myState = history.state;
Если вы заметили, Facebook делает то же самое. Когда вы нажимаете кнопку Home или отправляетесь в профиль друга, новая страница не загружается. Цифра уведомления справа остается такой же, как и она (вместо повторной загрузки новой страницы), если у вас есть окно чата, оно остается как есть. Это связано с тем, что страница не перезагружается на новую страницу (в этом случае все виджеты, включая чат и тикер, также должны перезагружаться), только URL-адрес изменяется динамически, а новый контент извлекается и отображается через Ajax.
При просмотре Facebook в IE8
, который не поддерживает History
API, вы найдете его по-прежнему работает, но изменить поведение URL отличается. Это связано с тем, что они возвращаются к старым старым способам изменения URL-адресов, меняя хэш.
Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (http://meta.stackexchange.com/q/8259) включить существенные части ответа (например, пример использования API) здесь, и укажите ссылку для справки. –