history.replaceState()不使用history.scrollRestoration=';自动';穿着苗条/工装裤

history.replaceState()不使用history.scrollRestoration=';自动';穿着苗条/工装裤,scroll,navigation,svelte,sapper,Scroll,Navigation,Svelte,Sapper,我正在使用history.replaceState()更新我的页面的查询参数,而不会像中建议的那样重新加载页面 我还使用以下行存储用户的滚动位置: history.scrollRestoration = 'auto' 从一个页面导航到另一个页面时,滚动恢复工作正常-滚动位置在页面之间保持。但是,在使用我的setQueryParam功能更改查询参数后,滚动恢复将不再工作 为什么会这样 注意:在Svelte/Sapper之外,同样的代码也可以正常工作,只使用HTML和JavaScript。作为客户

我正在使用
history.replaceState()
更新我的页面的查询参数,而不会像中建议的那样重新加载页面

我还使用以下行存储用户的滚动位置:

history.scrollRestoration = 'auto'
从一个页面导航到另一个页面时,
滚动恢复
工作正常-滚动位置在页面之间保持。但是,在使用我的
setQueryParam
功能更改查询参数后,滚动恢复将不再工作

为什么会这样


注意:在Svelte/Sapper之外,同样的代码也可以正常工作,只使用HTML和JavaScript。

作为客户端路由器,Sapper必须大量劫持滚动管理和恢复,以模拟每次页面更改时完全重新加载浏览器时的正常行为

为此,需要知道要恢复的滚动位置

使用
history.replaceState
时,您正在更改状态(这是放置到
replaceState
的第一个参数)。因此,当您稍后弹出状态时,Sapper找不到其恢复滚动数据

您可以尝试手动保留历史记录状态,如下所示:

//注意第一个参数
history.replaceState(history.state',decodeURIComponent(`${window.location.pathname}?${params}`)

我不认为历史。滚动恢复实际上在Sapper中有任何效果。

“我不认为历史。滚动恢复实际上在Sapper中有任何效果。”-是的,因为如果我不替换状态,滚动位置保持不变。但是,如果更改
历史记录的值,滚动恢复是否会有任何不同?我的意思是,我不认为Sapper在它实现的滚动管理/恢复中考虑了这个选项。您是否尝试传递
历史记录。状态
?您是对的,我删除了
历史记录。ScrollRestaration='auto'
,它仍然保持滚动位置。此外,我尝试将
history.state
作为
replaceState()
中的第一个参数,现在一切似乎都按预期工作。然而,有两件奇怪的事情,首先,我认为history.state只是一个由用户定义的JSON对象,但显然其中包含私人信息,或者Sapper在幕后使用它。第二,我在我的另一个项目中尝试了同样的方法,即使没有通过
历史。state
,一切都很好。无论如何,非常感谢你的回答!关于
历史记录,您是对的。state
,它没有附加默认的浏览器行为。我还没有深入研究代码,但我几乎可以肯定是Sapper在代码中添加了一些东西。你的另一个项目也在使用Sapper吗?因为可以在没有
history.state
的情况下保存历史数据,在这种情况下,功能不会受到
replaceState
的影响。是的,我特意尝试了另一个使用相同版本的Svelte和Sapper的项目。无论如何,再次非常感谢!你帮我节省了很多时间!
history.scrollRestoration = 'auto'