最直接的方式:location.reload()
刷新当前页面,最常用的写法是:
location.reload();
不传参数时,浏览器可能从缓存读取页面资源,效果接近用户点击刷新按钮。需要强制拉取最新内容时,传入 true:
location.reload(true);
不过 true 参数已被标记为废弃,现代浏览器并不保证它的行为。更可靠的做法是配合服务端缓存头,或在 URL 上加时间戳参数。
用 location.href 或 assign 重新赋值
location.href = location.href;
location.assign(location.href);
这两种写法本质上是让浏览器重新导航到当前地址,效果与 reload() 类似。区别在于:如果 URL 带有 #hash,重新赋值可能只触发锚点跳转而不会真正重载页面。涉及单页应用的路由时,要特别留意这一点。
replace():不留下历史记录
location.replace(location.href);
replace() 会替换当前历史记录条目,用户点后退不会回到刷新前的页面。这在表单提交后防止重复提交的场景里很有用,但也意味着用户失去了返回上一步的入口,使用前要权衡。
history.go(0):等价但语义弱
history.go(0);
它表示在历史记录中前进或后退 0 步,实际效果就是重载当前页。写法简短,但可读性不如 reload(),团队协作中不推荐作为首选。
局部刷新:不重载整个页面
如果只是想让某块内容更新,完全刷新代价太大。可以用 fetch 拉取数据后更新 DOM,或把刷新逻辑封装成函数直接调用:
async function refreshList() {
const res = await fetch(‘/api/list’);
const data = await res.json();
render(data);
}
refreshList();
这种方式能保留滚动位置、表单输入和页面状态,体验明显更好。代价是需要自己处理数据请求和渲染逻辑。
常见坑点
表单重复提交:刷新前若页面处于 POST 结果页,浏览器可能弹出“确认重新提交表单”的提示。用 replace() 或采用 POST-Redirect-GET 模式可以规避。
刷新循环:在 beforeunload 或定时器里不加条件地调用刷新,容易造成页面反复重载甚至卡死。务必加判断条件。
单页应用:使用 History 路由的框架中,直接 location.reload() 会丢失内存中的状态,应优先使用框架提供的路由跳转或数据重取方法。
怎么选
需要整页重载且保留历史记录,用 location.reload();要强制绕过缓存,改用带时间戳参数的 URL 赋值;不希望用户后退回到旧页面,用 location.replace();只需更新局部内容,就走接口请求加 DOM 更新的路线。选对方法,比记住多少种写法更重要。