Javascript location.hash和history.replaceState
绑定到window.hashchange时出现问题。调用Javascript location.hash和history.replaceState,javascript,html,pushstate,html5-history,Javascript,Html,Pushstate,Html5 History,绑定到window.hashchange时出现问题。调用history.replaceState时,除非调用了location.hash,否则会触发“hashchange”事件。我正在使用Chrome42和jQuery来辅助绑定。我已经加载了Sammy.js(实际上我正在试图弄清楚Sammy将如何解释这种行为) 我正在控制台中调试,并执行以下操作: $(window.bind('hashchange',函数(e){alert('#change'+location.hash);}) history
history.replaceState
时,除非调用了location.hash
,否则会触发“hashchange”事件。我正在使用Chrome42和jQuery来辅助绑定。我已经加载了Sammy.js(实际上我正在试图弄清楚Sammy将如何解释这种行为)
我正在控制台中调试,并执行以下操作:
$(window.bind('hashchange',函数(e){alert('#change'+location.hash);})代码>
history.replaceState({},“,”#2”)
-->显示警报
location.hash=“3”
-->显示警报
history.replaceState({},“,“#4”)
-->不显示警报
这是一个bug,还是预期的行为?我本以为replaceState总是或者从来没有触发Chromium浏览器中的“hashchange”事件,但只有location.hash=“3”
行触发了一个hashchange
事件,而不是一个“bug”
从文件:
请注意,pushState()
不会导致触发hashchange
事件,即使新URL与旧URL仅在其哈希中不同
以及:
history.replaceState()
的操作方式与history.pushState()
完全相同,只是replaceState()
修改当前历史记录条目,而不是创建新条目
很简单,您必须在历史记录之后在窗口中触发hashchange
本机事件。replaceState例如:
history.replaceState(null,null,#yourHash');
dispatchEvent(新的HashChangeEvent('hashchange'));
我不知道Chrome 42,但Chrome 51在任何情况下都不会为replaceState
在我端触发hashchange
事件,我认为这是不应该的。你应该使用setInterval()吗函数并在隐藏输入上保存相应的哈希值,并在设置的时间间隔内验证它,如果输入值早于url上的哈希值,那么请执行您必须执行的操作并更新输入。在我的浏览器中,第一个“replaceState”会触发“hashchange”事件,我认为这是异常行为。。。但是Sammy.js可能会以某种方式进行干扰。我应该在不加载Sammy的情况下运行另一个测试。