99 lines
2.7 KiB
JavaScript
99 lines
2.7 KiB
JavaScript
|
|
// ================== 路由配置 ==================
|
|||
|
|
const routes = {
|
|||
|
|
'home': 'views/home.html',
|
|||
|
|
'channel': 'views/channel.html',
|
|||
|
|
'about': 'views/about.html'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 获取当前 hash 中的路径(去掉 #/)
|
|||
|
|
function getHashPath() {
|
|||
|
|
const hash = window.location.hash.slice(1) || '/';
|
|||
|
|
const path = hash.startsWith('/') ? hash.slice(1) : hash;
|
|||
|
|
return path || 'home';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ================== 加载视图 ==================
|
|||
|
|
async function loadView(path) {
|
|||
|
|
const routerView = document.getElementById('router-view');
|
|||
|
|
if (!routerView) return;
|
|||
|
|
|
|||
|
|
// 显示加载动画
|
|||
|
|
routerView.innerHTML = '<div class="loader" style="margin: 2rem auto;"></div>';
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const viewFile = routes[path];
|
|||
|
|
if (!viewFile) {
|
|||
|
|
await load404(routerView);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const response = await fetch(viewFile);
|
|||
|
|
if (!response.ok) {
|
|||
|
|
throw new Error(`HTTP ${response.status}`);
|
|||
|
|
}
|
|||
|
|
const html = await response.text();
|
|||
|
|
routerView.innerHTML = html;
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('加载视图失败:', error);
|
|||
|
|
routerView.innerHTML = `
|
|||
|
|
<div class="error-message">
|
|||
|
|
❌ 加载失败:${error.message}<br>
|
|||
|
|
<small>请检查文件是否存在,或刷新重试</small>
|
|||
|
|
</div>
|
|||
|
|
`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新导航高亮和状态栏
|
|||
|
|
updateActiveNav(path);
|
|||
|
|
updateStatusBar(path);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 加载 404 页面
|
|||
|
|
async function load404(container) {
|
|||
|
|
try {
|
|||
|
|
const resp = await fetch('views/404.html');
|
|||
|
|
if (resp.ok) {
|
|||
|
|
container.innerHTML = await resp.text();
|
|||
|
|
} else {
|
|||
|
|
container.innerHTML = '<div class="error-message">⚠️ 404 - 页面未找到</div>';
|
|||
|
|
}
|
|||
|
|
} catch {
|
|||
|
|
container.innerHTML = '<div class="error-message">⚠️ 404 - 页面未找到</div>';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新导航高亮
|
|||
|
|
function updateActiveNav(path) {
|
|||
|
|
document.querySelectorAll('.nav-link').forEach(link => {
|
|||
|
|
link.classList.remove('active');
|
|||
|
|
const linkPath = link.getAttribute('href').slice(2);
|
|||
|
|
if (linkPath === path) {
|
|||
|
|
link.classList.add('active');
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新状态栏
|
|||
|
|
function updateStatusBar(path) {
|
|||
|
|
const statusEl = document.getElementById('current-route');
|
|||
|
|
if (statusEl) {
|
|||
|
|
statusEl.textContent = `当前路由:/${path}`;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 监听 hash 变化
|
|||
|
|
window.addEventListener('hashchange', () => {
|
|||
|
|
const path = getHashPath();
|
|||
|
|
loadView(path);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 首次加载
|
|||
|
|
window.addEventListener('DOMContentLoaded', () => {
|
|||
|
|
if (!window.location.hash) {
|
|||
|
|
window.location.hash = '#/home';
|
|||
|
|
} else {
|
|||
|
|
const path = getHashPath();
|
|||
|
|
loadView(path);
|
|||
|
|
}
|
|||
|
|
});
|