location.hash 和 history.replaceState

And*_*ewP 3 html javascript pushstate html5-history

我有绑定到 window.hashchange 的问题。调用 时history.replaceState,它会触发 'hashchange' 事件,除非调用了location.hash。我使用 Chrome 42 和 jQuery 来协助绑定。我已经加载了 Sammy.js(我实际上正在尝试弄清楚 Sammy 将如何解释该行为)

我正在控制台中调试,并执行以下操作:

$(window).bind('hashchange', function(e) { alert('# change' + location.hash); });

history.replaceState({}, "", "#2")-->显示警报

location.hash = "3" --> 显示警报

history.replaceState({}, "", "#4")-->不显示警报

这是一个错误,还是预期的行为?我会认为 replaceState 要么总是,要么从未触发 'hashchange' 事件

und*_*ned 7

在我的 Chromium 浏览器中,只有该location.hash = "3"行触发了一个hashchange事件,而不是一个“错误”。

来自MDN文档:

请注意,即使新 URL 与旧 URL 仅在其哈希上不同,也pushState()永远不会导致hashchange触发事件。

和:

history.replaceState()操作完全一样,history.pushState()除了replaceState()修改当前历史条目而不是创建新历史条目。


Mas*_*iri 6

这很简单,您必须hashchange在 history.replaceState 之后在 window 中触发本机事件,例如:

history.replaceState(null, null, '#yourHash');
window.dispatchEvent(new HashChangeEvent('hashchange'));
Run Code Online (Sandbox Code Playgroud)