Плагин jQuery $ .address (): ссылки на hashbang сталкиваются с поддержкой состояния HTML5 - PullRequest
2 голосов
/ 26 мая 2011

Вот сценарий, описывающий проблему:

Пользователь A имеет браузер с поддержкой состояния HTML5 и отправляет эту ссылку пользователю B:

http://domain.tld/node

Пользователь B, который использует браузер без поддержки состояния HTML 5, переходит на другой узел и отправляет ссылку обратно пользователю A:

http://domain.tld/node#!/another-node

Но когда пользователь A щелкает ссылку, вместо /another-node отображается содержимое /node.

Запрос jQuery $.address() плагин от Asual показывает, что он интерпретирует«адрес хэш-банга» в качестве значения хеш-функции:

> $.address.value()
  "/node#/another-node"
> $.address.path()
  "/node"
> $.address.hash()
  "/another-node"

(Любопытно, что «!» удаляется из хэш-банга.)

Может ли эта неоднозначность быть преодолена путем изменения моей реализации?

Я мог бы отключить поддержку API истории, если в URI найден хэш-банг, но я бы предпочел этого не делать.

1 Ответ

3 голосов
/ 21 июля 2011

Я смог решить эту проблему, немного изменив свою реализацию.

По сути, я определяю, какой адрес должен быть основан на возможностях браузера, проверяю, сопоставим ли он с реальным адресом, и если он не совпадает, используйте 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() - это маленькая чепуха, взятая из Марк Пилигрим
...