Плагин 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() немного чуток взят от Марка Пилигрима
Другие вопросы по тегам