Плагин jQuery $.address(): ссылки на хэш-банг сталкиваются с поддержкой состояния HTML5
Вот сценарий, который описывает проблему:
Пользователь A имеет браузер с поддержкой состояния HTML5 и отправляет эту ссылку пользователю B:
http://domain.tld/node
Пользователь B, который использует браузер без поддержки состояния HTML 5, переходит на другой узел и отправляет ссылку обратно пользователю A:
http://domain.tld/node#!/another-node
Но когда пользователь A щелкает ссылку, содержимое для /node
отображается вместо /another-node
,
Опрос JQuery Асуала $.address()
Плагин показывает, что он интерпретирует "адрес hashbang" как значение хеша:
> $.address.value()
"/node#/another-node"
> $.address.path()
"/node"
> $.address.hash()
"/another-node"
(Любопытно, что "!" Сброшено с hashbang.)
Можно ли преодолеть эту двусмысленность изменением моей реализации?
Я мог бы отключить поддержку API истории, если в URI найден хэш-банг, но я бы предпочел этого не делать.
1 ответ
Я смог решить эту проблему, немного изменив свою реализацию.
По сути, я определяю, какой адрес должен быть основан на возможностях браузера, проверяю, сопоставим ли он с реальным адресом, и, если он не совпадает, использую location.replace()
заменить адрес без создания новой записи в истории.
var addressValue = $.address.value(),
initPath = window.location.pathname.replace(stateBasePath, ""),
newLocation = baseUrl +stateBasePath + (supports_history_api() ? "" : "/#!") + (addressValue != "/" ? addressValue : initPath + window.location.search);
if (newLocation != window.location.href) {
window.location.replace(newLocation);
}
Этот код должен быть выполнен как можно скорее - вне функции готовности DOM.
stateBasePath
эквивалентно значению, которое вы использовали бы для$.address.state()
(просто пустая строка, если сайт находится в корне документа)baseUrl
это протокол и домен URI, напримерhttp://domain.tld
(без косой черты)supports_history_api()
немного чуток взят от Марка Пилигрима