历史记录API现在是supported in every popular browser。似乎不再需要哈希回退,_escaped_fragment_
技巧或other workarounds。 2013年的酷库(如History.js)现在似乎毫无用处。但有一些事情我不确定 - 例如title handling seems tricky显然title
中pushState
requestURI
的论点没有做任何事情。
我的问题是,我是否真的可以依赖历史API在浏览器中表现一致,还是我还需要一些特定于浏览器的代码?这也意味着:我是否需要在不同的浏览器中运行集成测试来测试我的代码呢?如果存在不一致之处,那么它们是什么? (注意我只对现代浏览器感兴趣,所以没有IE< 11)。
也许为大型SPA实施路由的人可以分享他们的经验吗?
答案 0 :(得分:4)
注意:这不是一个完整的答案,所以我不期待赏金,但它仍然回答了一些问题所以我决定把它作为答案
与大多数API一样,仍然存在一些差异(您不会相信浏览器之间的classList有多么不一致);问题主要在于它们有多严重。
pushState
最常用于SPA,它们似乎忽略了object参数,并且主要处理URL。这意味着与状态对象处理相关的错误可能更少"可见"对大众来说。
我最近发现的唯一一个影响我正在做的事情是在IE& Edge(甚至14)history.state
是一个getter,因此它在每次访问时都会获得一个新的对象实例。这意味着您无法缓存状态对象并将其与history.state
进行比较,以查看是否推送了新对象。这是错误报告:https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/944050/
此外,请注意,没有浏览器支持通过pushState
设置标题,也没有人会这样做,但为时已晚。如果浏览器开始支持,pushState
- 使用网站会突然清除浏览器历史记录中的所有标题,因为代码在那里传递空字符串。你只需要接受第二个参数是没用的。
答案 1 :(得分:2)
实际上,您可以通过历史记录库查看所有支持的浏览器:https://github.com/browserstate/history.js/#browsers-tested-and-working-in
这个lib解决了buglist,来自同一页面:
- HTML5浏览器
- 当浏览回到初始状态时,Chrome 8有时不包含正确的状态数据
- Safari 5,Safari iOS 4和Firefox 3和4在页面加载哈希值时不会触发
onhashchange
事件- 与其他浏览器不同,当哈希值发生变化时,Safari 5和Safari iOS 4不会触发
onpopstate
事件- 一旦哈希被
取代,Safari 5和Safari iOS 4无法返回正确的状态replaceState
电话/ bug report- Safari 5和Safari iOS 4有时无法在繁忙条件/ bug report
下应用状态更改- 一旦页面加载/ change recommendation
,RC之前的Google Chrome 8,9,10和Firefox 4将始终触发onpopstate
- Safari iOS 4.0,4.1,4.2具有可用的HTML5历史记录API - 虽然浏览器的实际后退按钮不起作用,因此我们将它们视为HTML4浏览器
- HTML5浏览器中没有一个实际使用
title
和pushState
来电的replaceState
参数- HTML4浏览器
- MSIE 6,7和Firefox 2等旧浏览器没有
onhashchange
事件- MSIE 6和7有时不会应用哈希,即使被告知(需要再次调用apply函数)
- 当哈希值不是
时,非Opera HTML4浏览器有时不会应用哈希值urlencoded
- 所有浏览器
- 状态数据和标题在网站离开后不会保留,然后返回(包括页面刷新)
- 州名称永远不会应用于
document.title
这可能会告诉您有关现有差异的信息。
答案 2 :(得分:0)
在4版本之前,Androids中的历史API存在一些问题,但通常它在所有主流浏览器中都能正常运行。