如何用javascript实现路由功能_怎样构建单页面应用基础【教程】
发布时间 - 2026-01-23 00:00:00 点击率:次SPA路由核心是用history.pushState更新URL而不刷新页面,需配合popstate监听、拦截a标签点击、健壮路径匹配及首次加载手动渲染。
直接用 history.pushState 操作 URL 而不刷新页面
单页应用(SPA)路由的核心,是不让浏览器真正跳转,而是手动更新地址栏并响应变化。关键在于绕过默认的页面重载行为: history.pushState 和 history.replaceState 是唯一直接、标准、无兼容性问题的方式(IE10+ 支持)。locat 虽然兼容性更好,但会多一个 
#,且不利于 SEO 和服务端直出。
实操建议:
- 每次“跳转”都调用
history.pushState({ path: '/user' }, '', '/user')—— 第一个参数是状态对象(可存任意数据),第二个是 title(通常为空),第三个才是真实路径 - 必须配合
popstate事件监听返回/前进操作:window.addEventListener('popstate', e => render(e.state?.path || location.pathname)) - 注意:
pushState不会触发popstate,只对浏览器前进/后退生效;首次加载仍需手动调用一次render
拦截 点击并阻止默认跳转
用户点击链接时,浏览器默认会发起新请求,这会彻底破坏 SPA 体验。必须主动捕获所有内部链接点击,改用 JS 控制路由逻辑。
常见错误现象:点击后页面白屏或整页刷新,说明某些 没被拦截。
实操建议:
- 用事件委托绑定到
document,避免漏掉动态插入的链接:document.addEventListener('click', e => { if (e.target.matches('a[href^="/"]') && !e.target.hasAttribute('target')) { e.preventDefault(); router.navigate(e.target.getAttribute('href')); } }) - 只拦截以
/开头、且没target属性的链接(排除外链和新窗口) - 不要用
onclick内联 handler,维护成本高且易遗漏
匹配路径时慎用字符串相等,优先考虑前缀或正则
简单用 location.pathname === '/user' 只能处理静态路径,一旦涉及参数(如 /user/123)、嵌套路由(/admin/users)或带查询参数的场景,就会失效。
实操建议:
- 基础场景可用
pathname.startsWith('/admin')判断布局层级 - 带参数的路径推荐用正则:
const match = pathname.match(/^\/user\/(\d+)$/),提取match[1]即 ID - 避免手写复杂正则,可封装一个轻量
matchPath(pathname, pattern)函数,支持"/user/:id"这类写法(但不必引入完整 React Router 语法) - 注意结尾斜杠:/user 和 /user/ 是不同路径,统一处理(比如强制去除末尾
/)
popstate 事件监听不到初始页面加载
这是最容易忽略的坑:用户直接访问 https://site.com/user 或刷新页面时,popstate 根本不会触发,导致页面空白或渲染首页。
原因在于该事件只在历史栈变化(前进/后退)时抛出,首次加载属于“进入”,不是“切换”。
实操建议:
- 页面初始化时,必须显式读取
location.pathname并调用渲染函数:render(location.pathname) - 把初始化逻辑和
popstate回调抽成同一个函数,避免重复代码 - 如果用了
pushState初始化状态(比如从服务器注入当前路径),也要确保 state 对象正确传入,否则e.state为null
# react
# javascript
# java
# html
# js
# seo
# 浏览器
# 栈
# 路由
# win
# a标签
# gate
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何与Pusher实现实时通信?(WebSocket示例)
在Oracle关闭情况下如何修改spfile的参数
如何做网站制作流程,*游戏网站怎么搭建?
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
如何快速重置建站主机并恢复默认配置?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Laravel中的withCount方法怎么高效统计关联模型数量
怎么用AI帮你为初创公司进行市场定位分析?
JavaScript如何操作视频_媒体API怎么控制播放
北京的网站制作公司有哪些,哪个视频网站最好?
如何在Windows服务器上快速搭建网站?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
黑客如何利用漏洞与弱口令入侵网站服务器?
如何自定义建站之星网站的导航菜单样式?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
中山网站推广排名,中山信息港登录入口?
如何用AWS免费套餐快速搭建高效网站?
Laravel如何处理和验证JSON类型的数据库字段
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
如何在IIS服务器上快速部署高效网站?
Laravel如何为API生成Swagger或OpenAPI文档
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
教你用AI将一段旋律扩展成一首完整的曲子
如何快速搭建自助建站会员专属系统?
如何在IIS7上新建站点并设置安全权限?
WEB开发之注册页面验证码倒计时代码的实现
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
JavaScript如何实现继承_有哪些常用方法
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
什么是javascript作用域_全局和局部作用域有什么区别?
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
php打包exe后无法访问网络共享_共享权限设置方法【教程】
如何在阿里云域名上完成建站全流程?
原生JS实现图片轮播切换效果
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
黑客如何通过漏洞一步步攻陷网站服务器?
如何正确下载安装西数主机建站助手?
如何快速搭建安全的FTP站点?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
如何获取PHP WAP自助建站系统源码?
如何用PHP快速搭建CMS系统?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
QQ浏览器网页版登录入口 个人中心在线进入

