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

Tho*_*ban 6 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 );
Run Code Online (Sandbox Code Playgroud)

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

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

1st 17
2nd 17
3rd 17
4th 17
Run Code Online (Sandbox Code Playgroud)

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

小智 1

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

从第 7.8.1节中的步骤 6 :在WHATWG HTML 规范的文档之间导航。

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

从第 7.8.9导航到片段

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

我没有看到任何关于以某种方式替换历史记录条目的信息,而不是修改它(如果它只是片段更改)。.length和 的行为.back()都应该引用同一组历史记录条目(组合的“联合会话历史记录”),因此它们似乎不应该表现出这样的不一致。从本节的注释中:

window.history.length

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

window.history.back()

联席会议历史回溯了一步。