历史API在现代浏览器中是否一致?

时间:2016-08-10 17:03:20

标签: javascript cross-browser single-page-application history.js html5-history

历史记录API现在是supported in every popular browser。似乎不再需要哈希回退,_escaped_fragment_技巧或other workarounds。 2013年的酷库(如History.js)现在似乎毫无用处。但有一些事情我不确定 - 例如title handling seems tricky显然titlepushState requestURI的论点没有做任何事情。

我的问题是,我是否真的可以依赖历史API在浏览器中表现一致,还是我还需要一些特定于浏览器的代码?这也意味着:我是否需要在不同的浏览器中运行集成测试来测试我的代码呢?如果存在不一致之处,那么它们是什么? (注意我只对现代浏览器感兴趣,所以没有IE< 11)。

也许为大型SPA实施路由的人可以分享他们的经验吗?

3 个答案:

答案 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事件
    •   
    • 一旦哈希被replaceState电话/ bug report
    • 取代,Safari 5和Safari iOS 4无法返回正确的状态   
    • 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浏览器中没有一个实际使用titlepushState来电的replaceState参数
    •   
  •   
  • HTML4浏览器      
        
    • MSIE 6,7和Firefox 2等旧浏览器没有onhashchange事件
    •   
    • MSIE 6和7有时不会应用哈希,即使被告知(需要再次调用apply函数)
    •   
    • 当哈希值不是urlencoded
    • 时,非Opera HTML4浏览器有时不会应用哈希值   
  •   
  • 所有浏览器      
        
    • 状态数据和标题在网站离开后不会保留,然后返回(包括页面刷新)
    •   
    • 州名称永远不会应用于document.title
    •   
  •   

这可能会告诉您有关现有差异的信息。

答案 2 :(得分:0)

在4版本之前,Androids中的历史API存在一些问题,但通常它在所有主流浏览器中都能正常运行。