2

問題を説明するシナリオを次に示します。

ユーザー A はHTML5 状態をサポートするブラウザーを使用しており、次のリンクをユーザー B に送信します。

http://domain.tld/node

HTML 5 状態をサポートしないブラウザーを使用するユーザー B は、別のノードに移動し、リンクをユーザー A に送り返します。

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

しかし、ユーザー A がリンクをクリックすると、 の/node代わりに のコンテンツが表示され/another-nodeます。

Asual の jQuery$.address()プラグインにクエリを実行すると、「ハッシュバン アドレス」がハッシュ値として解釈されていることがわかります。

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

(不思議なことに、"!" はハッシュバンから削除されます。)

このあいまいさは、実装を変更することで克服できますか?

URI に hashbang が見つかった場合、history API のサポートを無効にすることもできますが、それは避けたいと思います。

4

1 に答える 1

3

実装を少し変更することで、この問題を解決できました。

基本的に、ブラウザの機能に基づいてアドレスを決定し、実際のアドレスと照合し、一致しない場合は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()(サイトがドキュメント ルートにある場合は空の文字列のみ)。
  • baseUrlURI プロトコルとドメインです。例: http://domain.tld(末尾のスラッシュなし)
  • supports_history_api()マーク・ピルグリムから取った少し気の利いたものです
于 2011-07-20T21:11:58.217 に答える