据我所知,您只能区分“我的应用程序更改了主题标签”与“浏览器强制更改主题标签”之间的区别。
这就是我检查它的方式:
当您的控制器使用其新标签推送新状态(打开页面)时,请在将其设置为 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 中并比较更改。根据该信息,您可以估计后退/前进导航事件。