Как facebook перезаписывает исходный URL-адрес страницы в адресной строке браузера?

Перейдите на http://www.facebook.com/facebook?v=wall, затем щелкните вкладку информации . Контент будет загружен, и адресная строка теперь станет http://www.facebook.com/facebook?v=info, но веб-страница не перезагрузилась.

Сначала я думаю, что это Ajax, но у меня вопрос, как изменить адресную строку без перезагрузки? Я знаю, что могу изменить привязку (#wall) с помощью JS, но строку запроса (? V = wall), как?


person cdxf    schedule 03.10.2010    source источник
comment
Я вижу много голосов и фаворитов, но у кого-нибудь есть ответ?   -  person cdxf    schedule 03.10.2010
comment
Также во вкладке браузера есть индикатор загрузки.   -  person jcubic    schedule 03.10.2010
comment
@Snoob: Давай, давай. Люди голосуют, потому что тоже хотят знать ответ ...   -  person Felix Kling    schedule 03.10.2010
comment
Потому что я очень плохо говорю по-английски, поэтому мне нужно, чтобы кто-то помог мне переписать (сделать его более понятным) этот вопрос, спасибо   -  person cdxf    schedule 03.10.2010
comment
Разве это не то же самое, что и на вкладках StackOverflow ??   -  person Sandeep Singh Rawat    schedule 03.10.2010
comment
Аналогичное поведение можно увидеть и на Flickr. Откройте любую фотографию на Flickr, и вы увидите наборы фотографий справа. Нажмите на название набора фотографий, и значение в адресной строке изменится без перезагрузки страницы.   -  person Veera    schedule 03.10.2010
comment
Отредактировал для вас лучший английский ... скажите, пожалуйста, есть ли ошибка, которую я не заметил :)   -  person chakrit    schedule 04.10.2010
comment
@Sandeep: Нет, потому что Stack Overflow не использует Ajax для загрузки содержимого страницы.   -  person Sasha Chedygov    schedule 19.10.2010


Ответы (4)


Он использует новую функцию HTML5 history.pushState(), позволяющую странице замаскироваться под URL-адрес, отличный от того, с которого он был первоначально получен.

Похоже, что на данный момент это поддерживается только WebKit, поэтому остальные из нас видят ?v=wall#!/facebook?v=info вместо ?v=info.

Эта функция позволяет правильно добавлять в закладки динамически загружаемые страницы, обмениваться ими и т. Д. Между пользовательскими агентами, поддерживающими и не поддерживающими JS. Потому что, если вы как пользователь JS связали кого-то с ?v=wall#!/facebook?v=info, а его браузер не поддерживал JS и XMLHttpRequest, страница для них не работала бы. #! также используется в качестве подсказки поисковым системам для загрузки версии, отличной от AJAX.

person bobince    schedule 03.10.2010

@Snoob - я был бы признателен, если бы вы приняли ответ @bobince вместо этого он сначала был на правильном пути в отношении специфики. Поскольку я не могу удалить / удалить это, пока оно не будет принято, я обновлю его, чтобы он был как можно более правильным.


В настоящий момент вы видите (или, скорее, не видите) конкретную вещь WebKit (Chrome, Safari и т. д.), как @ bobince указывает, что в других браузерах вы можете видеть реальный URL-адрес на панели:

http://www.facebook.com/facebook?v=wall#!/facebook?v=info\

Где Chrome просто показывает:

http://www.facebook.com/facebook?v=info

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

Исправление специфики: браузеры Webkit показывают сокращенный URL-адрес, который facebook хочет использовать с помощью функций истории HTML 5 вы можете увидеть здесь код (обратите внимание на HistoryManager), в данном случае они конкретно используют _ 4_, чтобы заменить URL, по которому вы перешли, на доступный прямой.

Примечание. Этот ответ может быть недействителен позже (бит, специфичный для WebKit), поскольку другие браузеры все больше и больше поддерживают функции HTML5, это может быстро устареть.

person Nick Craver    schedule 03.10.2010
comment
Отличная находка Ника. Замечу, что это, вероятно, специфическая вещь для WebKit, поскольку она работает точно так же в Safari. - person anddoutoi; 03.10.2010
comment
@anddoutoi - у меня нет Safari для тестирования :) Я обновлю, чтобы включить это ... и примечание, что этот ответ может быстро устареть, поскольку другие поддерживают биты HTML5 все больше и больше. - person Nick Craver; 03.10.2010
comment
Интересно отметить, что рассмотрение нового дизайна Twitter в браузере Webkit не соответствует тому же шаблону, который мы наблюдаем в Facebook, т.е. я все еще вижу /#! в URL-адресах Twitter, но не в URL-адресах Facebook. - person chigley; 03.10.2010
comment
@chigley - в этом случае причина, что он работает в WebKit, заключается в том, что history поддержка HTML5, у @bobince правильная идея, хотя для этого конкретного примера он использует .replaceState() вместо .pushState() (хотя facebook использует его в другом месте). Посмотрите объект HistoryManager здесь: static.ak.fbcdn.net /rsrc.php/zF/r/4A0A_IDcjJ7.js - person Nick Craver; 03.10.2010
comment
Хотя информация #! тоже полезна. Я раньше не видел, чтобы это определялось как стандартное поведение паука, надеюсь, другие движки тоже это подберут. - person bobince; 04.10.2010
comment
@bobince - Есть другие поисковики ?? - person Nick Craver; 04.10.2010

Разработчикам MooTools я рекомендую попробовать плагин cpojer mootools-history, который обеспечивает поддержку собственного API истории, когда доступно, с возвратом к хешам.

person Ronny    schedule 21.10.2010

У меня нет Facebook, поэтому я не могу проверить. Но я на 95% уверен, что это должен быть запрос полной страницы, строка адреса недоступна для записи, потому что это была бы очень полезная функция, которую можно исключить для фишинговых веб-сайтов (вместо http://fakeonlinebank.com будет переписан на http://yourtrustybank). Возможно, это так быстро, что ваш браузер загружает только эту часть?

Но мне любопытно посмотреть, поправит ли меня кто-нибудь по этому поводу, потому что это будет означать, что у них есть ответ, который вы действительно хотите услышать;)

person CharlesLeaf    schedule 03.10.2010
comment
Спасибо, я попытался использовать Firebug, чтобы что-то изменить в одном фейсбуке, затем я щелкнул вкладку информации и то, что я сделал, все еще жив - ›Это не запрос полной страницы - person cdxf; 03.10.2010
comment
Могут ли они использовать хранилище на стороне клиента для ускорения работы? - person Michael; 03.10.2010
comment
Какой браузер вы используете, в моем Firefox (Mac) это URL-адрес, который я получаю facebook.com/facebook?v=wall #! / facebook? v = info, определенно метод хеширования истории. - person Michael; 03.10.2010