最实用方案是用localstorage存最后访问路径、sessionstorage存滚动位置:路径用pathname+search获取干净值,键名lastvisitpath;滚动位置键名带路径后缀如scrollpos-/article/123,保存于beforeunload或路由离开钩子,恢复时加settimeout确保dom就绪,并支持结构化恢复与防抖降级。

直接用 localStorage 记录最后访问页面路径,配合 sessionStorage 存滚动位置,是最实用、兼容性好、不依赖后端的方案。关键不是“存得全”,而是“存得准、取得稳、跳得安全”。
记录最后访问的页面路径
用 window.location.pathname + window.location.search 获取干净路径(不含协议和域名),避免跨环境失效:
- 保存时机:页面加载完成时或用户主动跳转前(如点击链接、表单提交)
- 推荐键名:
lastVisitPath,值示例:/article/123?id=456 - 登出、清除账号数据、进入敏感页(如支付成功页)时,主动调用
localStorage.removeItem('lastVisitPath') - 跳转前做基础校验:读取后判断是否以
/开头,且不是登录页、注销页等兜底路径
记录并恢复滚动位置
滚动位置建议用 sessionStorage,因为它是会话级的——关掉标签页自动清空,天然适配“返回上一页”的场景:
一款AI开发辅助工具,主要用于从 AI 编程会话日志(Clawdbot、Claude Code、Codex)中提取对话记录。该功能用于在用户要求导出提示词历史、会话日志或 `.jsonl` 格式的会话文件时使用,适合需要提升相关任务效率的用户。
- 保存:在
beforeunload或路由离开钩子中执行,存window.scrollY(不用document.body.scrollTop) - 键名建议带路径后缀,例如
scrollPos-/article/123,避免不同页面互相覆盖 - 恢复:监听
DOMContentLoaded,加setTimeout(..., 50)确保 DOM 渲染完成再window.scrollTo(0, pos) - 只对浏览器返回行为生效:可用
performance.getEntriesByType('navigation')[0]?.type === 'back_forward'判断
进阶:按阅读进度或章节恢复
纯像素值易受字体加载、图片懒加载影响,更鲁棒的做法是结合结构信息:
- 记录时:除
percent外,同步存最近一个有id的标题元素(如h2#section-3) - 恢复时:先尝试
document.getElementById(id)?.scrollIntoView();失败再按百分比估算:window.scrollTo(0, (percent / 100) * document.body.scrollHeight) - 写入加防抖(如 300ms 内最多存一次),读取加
try...catch,私密模式失败时降级为内存缓存
注意事项与兜底处理
Web Storage 不是万能保险,需主动应对边界情况:
- iOS Safari 后台可能暂停 JS,最后几次滚动可能未保存,所以
beforeunload是更可靠的兜底时机 - 单页应用(SPA)需监听路由变化,在
beforeRouteLeave(Vue)或useEffect cleanup(React)中保存 - 避免存敏感路径(如
/user/profile/edit),未登录用户不应看到该记录 - 不要用 Cookie 替代:它随每次请求发往服务端,容量小、不安全、效率低










