history.replaceState仍会在“浏览历史记录”中添加条目

28

具体而言,调用以下代码片段:

history.replaceState(undefined, undefined, "#" + value)

这样做不会影响当前页面的“后退”按钮行为,但是会在“浏览历史记录”页面中添加一个条目,而我并不希望出现这种情况。下面是Chrome的历史记录页面截图,但在Firefox中也会发生相同的情况。

有没有某种方法可以替换当前的URL,而不会在用户的浏览历史记录中添加一项记录?

我想咨询的是独立的“浏览器历史记录”页面,而不是“后退”按钮使用的实际页面导航历史记录。

Chrome浏览器历史记录


我也曾经想过这个问题,但从未找到答案。 - Jake Wilson
1
我认为使用历史记录API实现你所要求的功能可能是不可能的,如果有可能也很困难。"history.replaceState()与history.pushState()完全相同,只是replaceState()修改当前的历史记录条目而不是创建一个新的条目。" https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history - pizzarob
@realseanp 对的,OP的截图显示replaceState正在创建新的不同条目。在当前的Chrome Canary中,历史记录和缓存已被清除,我仍然得到类似的行为。返回按钮可以浏览“替换”的状态。 - Ben
这个功能请求在bugzilla上已经开放了8年 - 可能在短时间内不会有任何改变:https://bugzilla.mozilla.org/show_bug.cgi?id=753264 - AnilRedshift
@AnilRedshift 如果你把你的评论变成一个答案,我可以给你赏金。(如果我在接下来的23小时内在线的话。) - John
当然,谢谢 @John - AnilRedshift
2个回答

4
我无法在W3C规范中找到有关全局历史记录的任何信息,但即使是会话历史记录的预期行为也没有具体说明。
实际上,这已经是一个未解决的错误超过8年了,大多数浏览器选择以这种方式实现全局历史记录。简而言之,除了不调用pushState/replaceState之外,可能没有其他解决方法。

0

使用 location.replace("#" + value) 代替。与 history.replaceState(...) 类似,它不会添加新的浏览器历史记录条目,但也不会将条目添加到 Chrome 的“浏览器历史记录”页面(即会话历史记录)。

另请参见 https://dev59.com/fHE95IYBdhLWcg3wdtmj#6945614


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接