小编zer*_*day的帖子

如何区分浏览器返回和用户手动更改位置哈希

问题

/page.html#A给定从到 的导航/page.html#B,有没有办法区分用户:

  1. 单击浏览器的“后退”按钮,然后
  2. 手动将 url 更改回/page.html#A?

背景/背景

我正在构建一个网络应用程序,其中单个页面在多个内容幻灯片之间进行转换,每个内容都由特定位置哈希标识,例如'#A', '#B'

例如,当用户位于幻灯片“A”上并选择选项“B”时,位置将从 更改/page.html#A/page.html#B

转换后,location.hash==#B、 和back()(通过 JS 或浏览器按钮)将使用户返回到location.hash==#A

但是,没有什么可以阻止用户手动更改 URL 栏中的哈希值。在这种情况下,浏览器会认为这是向前导航,插入/page.html#B后退历史记录。也就是说,导航历史记录将是#A>> #B#A并且单击返回现在会将用户带到#B

我需要区分这两种情况,以便当我知道用户已手动更新 url 哈希时,我可以触发go(N)同步浏览器后退/下一个状态。

迄今为止的尝试

1)HTML5popstate事件:
我曾希望html5 popstate事件(https://developer.mozilla.org/en-US/docs/Web/Events/popstate)只会在case#1中被触发,但我可以确认它在这两种情况下都会发生火灾。

2)浏览器.onhashchange事件
我可以确认,如果存在,该事件在两种情况下都会被触发

hashChange() 3)我可以确认jQuery mobile在这两种情况下都会被触发

4)读取浏览器导航历史记录
我的下一个想法是维护一个哈希历史记录的JS数组,并比较新的哈希值和浏览器历史记录是否与JS数组匹配,但是出于安全原因JS无法读取浏览器位置历史记录。

想法

我知道如果我调用 window.history.forward(),并且不存在页面,则不会发生任何事情。我正在考虑哈希历史记录的JS数组,调用forward(),检查新的location.hash(现在安全性允许),与JS数组进行比较,然后调用go(N)来同步浏览器后退/下一个状态。但有点乱。

javascript browser hash back-button browser-history

5
推荐指数
1
解决办法
1916
查看次数

标签 统计

back-button ×1

browser ×1

browser-history ×1

hash ×1

javascript ×1