我有一个页面,使用历史API和push/popstate在客户端进行路由。这在所有现代浏览器上都能很好地工作(搜索引擎将由node.js预渲染支持)。
然而,最近我遇到了一个问题,就是IE在哈希更改时不会触发popstate事件,但url的pushstate却可以正常工作,包括IE11。
例如,像这样...
$(document).on('click', 'a', function(e) {
e.preventDefault();
History.pushState({}, '', $(this).attr('href'));
});
...能够正确触发...
$(window).on('popstate', function() {
console.log('url changed');
});
根据W3C规范,hashchange应该在更改当前历史记录时触发popstate。然而,在添加哈希链接(
<a href="#hashchange">...
)后,在IE上单击它,没有任何反应。:/我不想进行IE检测(因为现在有这么多浏览器可能会陷入同样的困境),而是使用特性检测。然而,由于历史记录(popstate/pushstate)在其余部分正常工作,我甚至无法检测到缺少push/popstate的问题...
if(!window.history || !window.history.pushState) { ...
...并使用hashchange代替。 :/
有什么想法吗?
PS. 作为奖励,使用带有hashtag url的jquery.history.js(history.js的jquery封装版本)会使整个事情崩溃。
http://localhost/routetest/index.html#/page1/1234
变成
http://localhost/page1/1234
... ??? :/
pushState()
似乎存在问题。请查看此提供答案的问题:https://dev59.com/9G865IYBdhLWcg3wnf9t - urbz