下面给你一份 《Windows.history 属性:History 对象的前世今生》超清晰讲解版,从浏览器发展史到现代前端的 SPA 应用都讲得通透,适合做笔记、写博客、或直接当科普文案使用。


🕰️ Windows.history 属性

——History 对象的前世今生(完整理解指南)

window.history 是浏览器中非常古老但又非常核心的对象,用来控制用户的浏览历史。随着 Web 的发展,它从最初的「只能前进后退」演变成今天支持 HTML5 History API 的强大工具,直接推动了 SPA 单页面应用的发展。

本文按时间顺序带你理解它的演变。


🧱 一、史前时代:History 的最初版本(只能前进/后退)

早期浏览器(IE3、Netscape)中,history 对象只有三个重要功能:

✔ 1. 后退

history.back();

✔ 2. 前进

history.forward();

✔ 3. 跳转指定步数

history.go(-2);  // 后退2步
history.go(1);   // 前进1步

那时的浏览器历史记录(Back/Forward Stack)完全由用户点击行为控制,JS 几乎无法操作 URL。

限制:

  • 不能修改 URL
  • 不能监听 URL 变化
  • 无法更新页面状态
  • 不能生成可分享的链接

这是“静态网页时代”的产物。


🚀 二、过渡时期:location.hash(前端黑科技的起点)

进入 AJAX 时代后(2005 以后),页面开始局部刷新,但历史记录无法反映状态变化。

于是前端想出了一个“黑科技”——利用 #hash 部分。

示例:

location.hash = "#/user/123";

特点:

  • 改变 hash 不会刷新页面
  • hash 变化会增加新的历史记录
  • 可以监听事件:
window.onhashchange = () => { ... };

SPA(单页面应用)早期版本,就是靠 hash 路由:

http://example.com/#/home
http://example.com/#/login

优点: 不刷新、不跳转、安全
缺点: URL 丑、SEO 极差


🧬 三、现代时代:HTML5 History API(前端革命)

2012 年以后,HTML5 History API 被加入标准,史称前端路由革命。

新增两个重量级方法:

✔ 1. pushState()

向历史记录栈添加一个新状态(不会刷新页面):

history.pushState({id: 1}, "title", "/profile/1");

✔ 2. replaceState()

替换当前历史记录(不会刷新页面):

history.replaceState({page: 2}, "title", "/home?page=2");

✔ 3. popstate 事件(监听返回/前进)

window.onpopstate = (event) => {
    console.log(event.state);
};


🎮 四、pushState 与真实导航的区别

行为是否刷新页面是否产生历史记录
location.href = ''✔ 刷新
location.hash = ''✘ 不刷新
pushState()✘ 不刷新
replaceState()✘ 不刷新✘ 仅替换

所以 SPA 能在不刷新页面的情况下,做到“假跳转”。


🌐 五、History API 推动 SPA 兴起

现代框架全部基于 History API 构建路由系统:

✔ React Router

✔ Vue Router

✔ Angular Router

✔ SvelteKit

SPA 能实现:

  • 地址栏变化 ≠ 刷新页面
  • 浏览器前进/后退 控制应用状态
  • 每个页面可分享、可收藏、可统计 SEO
// Vue router 底层核心原理之一
history.pushState({route: '/home'}, "", "/home");


🛡️ 六、安全限制:为什么 history 不能跨域伪造?

以下行为是被禁止的:

✔ 你不能修改别的域名
✔ 不能用历史记录钓鱼
✔ 不能伪造回退时跳到危险站点

浏览器强制要求:

pushState 的 URL 必须和当前页面同源

否则会抛:

SecurityError: Failed to execute 'pushState'


🧩 七、History 对象的属性大全(现代浏览器)

属性含义
history.length历史记录长度
history.state当前记录的 state 对象
history.scrollRestoration控制返回后的滚动位置(auto/manual)

🧨 八、History 对象的经典应用场景

🎯 1. 前端路由(SPA)

pushState + popstate = Router 核心

🎯 2. 图片浏览器(左右翻页)

history.go(1/-1) 实现前后翻页操作

🎯 3. 表单结果页的“不可返回”

history.replaceState(null, '', location.href);

🎯 4. 防止重复提交

POST 成功后 replaceState 清除历史记录


📌 九、真正理解 History 的一句话总结

History 对象是浏览器“前进/后退栈”的 JS 操作接口。
从只能控制导航 → 到 HTML5 直接控制 URL → 再到 SPA 的路由革命。
它让前端真正具备了「控制 URL 而不刷新页面」的能力。