鉴于从/page.html#B
到/page.html#A
的导航,有没有办法区分用户:
'#A'
?我正在构建一个网络应用,其中一个页面在多个内容幻灯片之间转换,每个内容都由特定的位置哈希标识,例如'#B'
,/page.html#A
。
例如,当用户使用幻灯片' A'并选择选项' B'时,位置会从/page.html#B
更改为location.hash==#B
。< / p>
转换后,back()
和location.hash==#A
(通过JS或浏览器按钮)会将用户返回/page.html#B
。
但是,没有什么可以阻止用户手动更改URL栏中的哈希值。在这种情况下,浏览器会认为这是向前导航,在后面的历史记录中插入#A
。也就是说,导航历史记录为#B
&gt; #A
&gt; #B
然后点击返回即可将用户转到go(N)
。
我需要区分这两种情况,以便当我知道用户手动更新了url哈希时,我可以触发popstate
来同步浏览器的后退/下一状态。
1)HTML5 .onhashchange
事件:
我原本希望html5 popstate事件(https://developer.mozilla.org/en-US/docs/Web/Events/popstate)只会在案例#1中被触发,但我可以确认它在两种情况下都会触发。
2)浏览器hashChange()
事件
我可以确认,如果存在,则在两种情况下都会触发该事件
3)jQuery mobile {{1}} 我确认在两种情况下都被解雇了
4)阅读浏览器导航历史
我的下一个想法是维护一个散列历史的JS数组,并比较新散列和浏览器历史是否与JS数组匹配,但出于安全原因,JS无法读取浏览器位置历史记录。
我知道如果我调用window.history.forward(),并且没有页面存在,则没有任何反应。我正在考虑一个散列历史的JS数组,调用forward(),检查新的location.hash(现在安全性允许它),与JS数组比较,然后调用go(N)来同步浏览器back / next州。但它有点乱。
答案 0 :(得分:0)
由于javascript中没有后退按钮事件,我建议您最好在页面上创建自己的后退按钮
答案 1 :(得分:0)
back()
/ forward()
浏览器按钮和location.hash
也可以同时使用页面内HTML元素导航。
back()
,forward()
和go()
来电不会立即更新location.hash
。需要通过setTimeout()
等待〜10ms才能让浏览器完成导航并更新location
。backward_history_hashes
数组(注意'向后'意味着逻辑上,而不是暂时的)current_location.hash
forward_history_hashes
in-page
导航的布尔标记,默认为FALSE
ignore_hash_change
setTimeout()
监视器以检查location.hash更改在每种情况下,历史数组都是location.hash
es
on_in_page_navigation()
in_page_flag
= true
back()
,forward()
或go(N)
in_page_flag
= false
on_location_hash_change()
ignore_hash_change
= true
! in_page_flag
)rewrite_browser_history()
location.hash
ignore_hash_change
= false
rewrite_browser_history()
back()
和forward()
调用以生成所需的浏览器历史记录go(N)
到期望的location.hash
以将浏览器历史记录与JS历史数组同步