location.hash是最轻量、零依赖的单页切换入口,兼容所有浏览器,通过hashchange监听变化实现无刷新路由,需手动注册事件并首次主动处理,视图切换推荐用CSS class控制显隐,确保URL与视图状态严格同步。
location.hash 是最轻量、零依赖的单页切换入口,不需要框架、不发请求、兼容所有浏览器,适合静态页或原型验证。hashchange 监听 URL 变化浏览器地址栏中 #home、#about 这类片段不会触发页面刷新,但会触发 hashchange 事件。这是原生 SPA 的底层支点。
window.addEventListener('hashchange', handler)
hashchange 不会自动触发,需主动调用一次 handler() 或检查 location.hash
location.hash
hash 值含 #,取真实路径要用 location.hash.slice(1) 或 location.hash.replace(/^#/, '')
display 或 classList
把每个“页面”写成独立 <div>,通过 CSS 控制显隐比操作 DOM 更快也更可控。
.view { display: none; } + .view.active { display: block; }
style.display,否则容易被内联样式锁死,后续 JS 难以覆盖.active,再给目标元素加,防止多个视图同时显示innerHTML = template),减少首屏体积pushState 和 replaceState 的实际限制想用干净路径(如 /about)代替 #about?可以,但代价是必须配服务端支持,否则刷新 404。
pushState(null, '', '/about') 能改 URL,但不发请求 —— 内容还得你手动渲染popstate 事件,但该事件**不会**在 pushState 调用时触发index.html,否则刷新就 404;Nginx 配置示例:try_files $uri $uri/ /index.html;
file:// 协议直接双击打开 HTML 文件时,pushState 会报错 —— 必须起本地服务(如 npx serve)#detail?id=123 切到 #list 后又点浏览器后退,你得能还原出那个 id=123 并重新拉取数据 —— 这意味着 hash 解析逻辑不能只写在初始化里,而要封装成可复用函数,且每次 hashchange 或 popstate 都要走一遍。