私の知る限り、「アプリケーションがハッシュタグを変更した」と「ブラウザがハッシュタグを強制的に変更した」の違いしかわかりません。
これは私がそれをチェックする方法です:
コントローラーが新しいハッシュタグを使用して新しい状態をプッシュする (ページを開く) 場合、この新しいハッシュタグを window.location.hash に設定する直前にグローバル JavaScript 変数に格納します。「hashchange」イベントをキャッチしたら、このグローバル変数を window.location.hash と比較します。グローバル変数が新しいハッシュ タグと同じ場合は、アプリケーションがハッシュ自体を変更した (そして新しいページを開いた) ことを意味します。グローバル変数が設定されていない場合は、ブラウザがナビゲーションを強制したことを意味します。ただし、ブラウザがアドレスバーの編集のため、または戻る/進むボタンのためにナビゲーションを強制したかどうかはわかりません。
次のコードを検討してください。
// Global hashtag variable, used to compare state changes
var gCurrentHash = window.location.hash;
// Called when hashtag is changed by the browser
function onHashChange(event)
{
var hash_tag = window.location.hash;
if (hash_tag != gCurrentHash)
{
// Browser forced navigation
}
else
{
// App caused navigation
}
}
window.addEventListener('hashchange', onHashChange, false);
コントローラで、ハッシュ タグを更新する直前に、次のコードを呼び出します。
gCurrentHash = window.location.hash;
window.location.hashtag を実際に変更する前に、これを呼び出すことが非常に重要です。
[編集] この代替案を試すことができます: ハッシュタグの変更履歴を Cookie に保存し、変更を比較します。その情報から、前後のナビゲーション イベントを推定できます。