为什么更改哈希不影响历史长度?

时间:2016-04-28 18:50:39

标签: javascript

请考虑以下代码段:

console.log( "1st", history.length );

location.hash = location.hash + "some-value";

console.log( "2nd", history.length );

setTimeout( function() {

  console.log( "3rd", history.length );

  history.back();

  console.log( "4th", history.length );

}, 1000 );

https://jsfiddle.net/1kqLofq4/2/

我很好奇为什么更改哈希不是调整历史长度但是使用history.back()需要还原哈希的更改?我已经使用Firefox 46和Chrome 49测试了这种情况。输出总是类似于:

1st 17
2nd 17
3rd 17
4th 17

我已经尝试搜索有关此案例的一些规范或信息,为什么这可能是预期的行为以及如何使用除history.length之外的其他信息来检测历史记录中的更改。但我得到的只是提示使用一些我不感兴趣的花哨的框架插件。

1 个答案:

答案 0 :(得分:1)

我可能会误解,但规范似乎并不支持这种行为。这可能是一个错误。

来自 7.8.1中的step 6:浏览WHATWG HTML规范的文档

  
      
  1. 片段:如果这不是重新加载触发的导航:将URL解析器算法应用于资源的绝对URL和browseContext的活动文档的地址;如果生成的URL记录的所有组件(忽略任何片段组件)都相同,并且要使用GET获取资源,并且资源的URL记录具有非空的片段组件(即使它是空),然后导航到该片段并中止这些步骤。
  2.   

来自section 7.8.9 Navigating to a fragment

  
      
  1. 在History对象的末尾附加一个新条目,表示新资源及其Document对象,相关状态和当前历史记录滚动恢复首选项。其URL必须设置为用户代理导航到的地址。标题必须保留未设置。
  2.   

我没有看到任何关于以某种方式替换历史记录条目的内容,而不是修改它,如果它只是一个片段更改。 .length.back()的行为都应该引用同一组历史条目(合并的#34;联合会话历史记录"),所以看起来他们不应该这样做。表现出这样的不一致。来自本节的注释:

  

window.history.length

     

返回联合会话历史记录中的条目数。

  

window.history.back()

     

返回联合会话历史记录中的一步。