如何在浏览器历史记录中查找当前位置索引

Dav*_*ble 17 javascript

浏览器提供通过window.history对象在客户端会话中访问的页面列表.有了这个,客户端代码可以向前和向后导航通过列表(使用history.back(),history.forward()history.go()).

但客户端代码如何确定当前页面所在历史记录的位置?例如,如果客户端访问页面A,B和C,则历史记录将包含三个项目,当前历史记录项目(或状态)将用于页面C.如果用户然后单击"后退"按钮,则当前页面现在是B.然而,history.length仍然是3,反映了总共访问了三个页面的事实.我们如何确定客户当前位于历史记录中的第2项?

一个更具体的问题是我想确定我是否位于历史记录中的第一个项目,以便我可以显示一个关闭页面的"关闭"按钮(假设它window.opener不是空的); 在历史记录中的任何其他位置,我想显示一个"后退"按钮,而不是导航到上一页.

这似乎是一个奇怪的遗漏,即历史对象中没有"当前指数".

注意:这类似于问题#12895940,但不同之处在于我真的只需要知道我是否位于历史记录的第一个位置.

Dav*_*ble 7

我想出的唯一一件事(仅适用于HTML5 +浏览器)就是这样的:

// Onload
{
    if (!history.state  &&  typeof(history.replaceState) == "function")
        history.replaceState({ page: history.length, href: location.href }, "foo");
}
Run Code Online (Sandbox Code Playgroud)

当页面首次加载时,这会将状态对象推送到历史堆栈中.(typeof需要检查以确保浏览器支持HTML5 replaceState()方法.)

稍后,我可以检查当前历史对象是否是被替换的列表中的第一个:

if (history.state  &&  history.state.page == 1) {
    // It appears that we are positioned at the first history item
    ...
}
Run Code Online (Sandbox Code Playgroud)

这似乎足以满足我的需要.