Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript location.hash和history.replaceState_Javascript_Html_Pushstate_Html5 History - Fatal编程技术网

Javascript location.hash和history.replaceState

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

绑定到window.hashchange时出现问题。调用
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的情况下运行另一个测试。