单页应用通过JavaScript路由实现视图切换,利用hash变化监听动态更新内容,支持静态路径映射与动态参数匹配,提升用户体验且无需服务端配合,适用于小型项目。

单页应用(SPA)通过动态更新页面内容,避免整页刷新,提升用户体验。JavaScript 路由是实现 SPA 的核心机制之一。下面介绍如何用原生 JavaScript 实现一个简单的前端路由系统。
利用 URL 中的 hash(#)部分变化不会触发页面刷新的特性,监听 hashchange 事件来切换视图。
示例结构:
立即学习“Java免费学习笔记(深入)”;
HTML 模板:
<nav> <a href="#/home">首页</a> <a href="#/about">关于</a> <a href="#/contact">联系</a> </nav> <main id="app"></main>
JavaScript 路由逻辑:
window.addEventListener('hashchange', function () {
const app = document.getElementById('app');
const route = window.location.hash.slice(2); // 去掉 '#/'
<p>if (route === 'home') {
app.innerHTML = '<h1>这是首页</h1>';
} else if (route === 'about') {
app.innerHTML = '<h1>这是关于页</h1>';
} else if (route === 'contact') {
app.innerHTML = '<h1>这是联系页</h1>';
} else {
app.innerHTML = '<h1>404 - 页面未找到</h1>';
}
});</p><p>// 初始化默认页面
window.addEventListener('load', function () {
if (!window.location.hash) {
window.location.hash = '#/home';
} else {
// 触发一次 hashchange 以显示初始内容
window.dispatchEvent(new HashChangeEvent('hashchange'));
}
});将路径与对应渲染函数映射为对象,便于维护和扩展。
const routes = {
'/home': () => '<h1>这是首页</h1>',
'/about': () => '<h1>这是关于页</h1>',
'/contact': () => '<h1>这是联系页</h1>',
'/': () => '<h1>这是首页</h1>'
};
<p>function render() {
const app = document.getElementById('app');
const path = window.location.hash.slice(1) || '/';
const routeHandler = routes[path];</p><p>app.innerHTML = routeHandler ? routeHandler() : '<h1>404 - 页面未找到</h1>';
}</p><p>window.addEventListener('hashchange', render);
window.addEventListener('load', function () {
if (!window.location.hash) {
window.location.hash = '#/';
} else {
render();
}
});如果需要支持类似 #/user/123 的路径,可以加入正则匹配。
const dynamicRoutes = [
{ path: /^\/user\/(\d+)$/, handler: (id) => `<h1>用户 ID:${id}</h1>` }
];
<p>function matchDynamicRoute(path) {
for (const route of dynamicRoutes) {
const match = path.match(route.path);
if (match) {
return route.handler(match[1]);
}
}
return null;
}</p><p>// 在 render 中加入:
// const dynamicContent = matchDynamicRoute(path);
// if (dynamicContent) {
// app.innerHTML = dynamicContent;
// return;
// }
基本上就这些。使用 hash 路由简单可靠,兼容性好,适合学习和小型项目。实际开发中也可基于 History API 实现无 # 的路由,但需服务端配合。这个基础版本已经能支撑一个轻量级 SPA 的导航需求。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号