window.location.href 何时更新?history.go(-1)执行后的URL疑问
关于
history.back()/history.go(-1)与window.location.href更新时机的解析 我来帮你把这个问题的核心细节理清楚:
1. 执行history.go(-1)瞬间的location.href状态
刚调用window.history.go(-1)的时候,浏览器只是触发了回退的异步请求,此时window.location.href仍然会指向当前页面的URL。这也是你用console.log(window.location.href)立刻输出会得到当前页面地址的原因——同步代码的执行优先级高于浏览器的跳转处理。
2. window.location.href的具体更新时机
window.location.href的更新发生在浏览器开始处理回退跳转的早期阶段,不需要等到上一页完全加载完成。但这个更新是异步的,会在你的同步代码(包括调用history.go(-1)的整个函数)执行完毕之后才会触发。
举个直观的例子:
console.log(window.location.href); // 输出当前页面URL window.history.go(-1); console.log(window.location.href); // 仍然输出当前页面URL,因为同步代码还没跑完
只有当同步代码全部执行完,浏览器开始处理跳转流程时,href才会被更新为上一页的URL。
3. 你引用的Stack Overflow代码逻辑解析
那段代码的设计完全利用了这种异步特性:
- 先记录当前页面的URL到
prevPage变量 - 调用
history.go(-1)发起回退请求 - 用
setTimeout延迟500ms检查window.location.href:- 如果
href和prevPage一致,说明回退失败(比如历史栈中没有上一页),就跳转到指定的fallback URL - 如果
href已经变化,说明回退成功,不需要额外操作
- 如果
之所以用setTimeout,就是为了给浏览器留出足够的异步处理时间,确保能准确判断回退是否生效。
内容的提问来源于stack exchange,提问作者techriften
相关产品推荐
相关产品推荐

