190 lines
5.5 KiB
JavaScript
190 lines
5.5 KiB
JavaScript
|
|
// 全局变量
|
|||
|
|
let tabCounter = 0;
|
|||
|
|
let activeTabId = 'home-tab';
|
|||
|
|
|
|||
|
|
// 页面加载完成后初始化
|
|||
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|||
|
|
initializeSystem();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 初始化系统
|
|||
|
|
function initializeSystem() {
|
|||
|
|
console.log('信息管理系统已加载');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 切换子菜单显示/隐藏
|
|||
|
|
function toggleSubmenu(submenuId) {
|
|||
|
|
const submenu = document.getElementById(submenuId);
|
|||
|
|
const arrow = submenu.parentElement.querySelector('.arrow');
|
|||
|
|
|
|||
|
|
if (submenu.classList.contains('expanded')) {
|
|||
|
|
submenu.classList.remove('expanded');
|
|||
|
|
arrow.classList.remove('rotated');
|
|||
|
|
} else {
|
|||
|
|
// 先关闭其他所有子菜单
|
|||
|
|
const allSubmenus = document.querySelectorAll('.submenu');
|
|||
|
|
const allArrows = document.querySelectorAll('.arrow');
|
|||
|
|
|
|||
|
|
allSubmenus.forEach(menu => menu.classList.remove('expanded'));
|
|||
|
|
allArrows.forEach(arrow => arrow.classList.remove('rotated'));
|
|||
|
|
|
|||
|
|
// 展开当前子菜单
|
|||
|
|
submenu.classList.add('expanded');
|
|||
|
|
arrow.classList.add('rotated');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 打开新的tab页面
|
|||
|
|
async function openTab(title, contentType) {
|
|||
|
|
tabCounter++;
|
|||
|
|
const tabId = `tab-${tabCounter}`;
|
|||
|
|
const contentId = `content-${tabCounter}`;
|
|||
|
|
|
|||
|
|
// 检查是否已经存在相同标题的tab
|
|||
|
|
const existingTab = Array.from(document.querySelectorAll('.tab')).find(tab =>
|
|||
|
|
tab.querySelector('span').textContent === title
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
if (existingTab) {
|
|||
|
|
// 如果已存在,直接激活该tab
|
|||
|
|
switchTab(existingTab.id);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建新的tab
|
|||
|
|
const tabBar = document.querySelector('.tab-bar');
|
|||
|
|
const newTab = document.createElement('div');
|
|||
|
|
newTab.className = 'tab';
|
|||
|
|
newTab.id = tabId;
|
|||
|
|
newTab.innerHTML = `
|
|||
|
|
<span>${title}</span>
|
|||
|
|
<button class="close-btn" onclick="closeTab('${tabId}')" aria-label="关闭">×</button>
|
|||
|
|
`;
|
|||
|
|
|
|||
|
|
// 添加点击事件
|
|||
|
|
newTab.addEventListener('click', function(e) {
|
|||
|
|
if (!e.target.classList.contains('close-btn')) {
|
|||
|
|
switchTab(tabId);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
tabBar.appendChild(newTab);
|
|||
|
|
|
|||
|
|
// 创建对应的内容区域
|
|||
|
|
const contentArea = document.querySelector('.content-area');
|
|||
|
|
const newContent = document.createElement('div');
|
|||
|
|
newContent.className = 'tab-content';
|
|||
|
|
newContent.id = contentId;
|
|||
|
|
|
|||
|
|
// 动态加载页面内容
|
|||
|
|
try {
|
|||
|
|
const pageContent = await loadPageContent(contentType);
|
|||
|
|
newContent.innerHTML = pageContent;
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('加载页面内容失败:', error);
|
|||
|
|
newContent.innerHTML = `
|
|||
|
|
<div class="page-content">
|
|||
|
|
<h2>${title}</h2>
|
|||
|
|
<p>页面加载失败,请稍后重试。</p>
|
|||
|
|
</div>
|
|||
|
|
`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
contentArea.appendChild(newContent);
|
|||
|
|
|
|||
|
|
// 激活新创建的tab
|
|||
|
|
switchTab(tabId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 切换到指定的tab
|
|||
|
|
function switchTab(tabId) {
|
|||
|
|
// 移除所有tab的active状态
|
|||
|
|
document.querySelectorAll('.tab').forEach(tab => {
|
|||
|
|
tab.classList.remove('active');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 隐藏所有内容
|
|||
|
|
document.querySelectorAll('.tab-content').forEach(content => {
|
|||
|
|
content.classList.remove('active');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 激活指定的tab
|
|||
|
|
const targetTab = document.getElementById(tabId);
|
|||
|
|
if (targetTab) {
|
|||
|
|
targetTab.classList.add('active');
|
|||
|
|
activeTabId = tabId;
|
|||
|
|
|
|||
|
|
// 显示对应的内容
|
|||
|
|
const contentId = tabId.replace('tab', 'content');
|
|||
|
|
const targetContent = document.getElementById(contentId);
|
|||
|
|
if (targetContent) {
|
|||
|
|
targetContent.classList.add('active');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 关闭tab
|
|||
|
|
function closeTab(tabId) {
|
|||
|
|
const tab = document.getElementById(tabId);
|
|||
|
|
const contentId = tabId.replace('tab', 'content');
|
|||
|
|
const content = document.getElementById(contentId);
|
|||
|
|
|
|||
|
|
if (!tab) return;
|
|||
|
|
|
|||
|
|
// 如果关闭的是当前激活的tab
|
|||
|
|
if (tabId === activeTabId) {
|
|||
|
|
// 找到前一个tab来激活
|
|||
|
|
const allTabs = document.querySelectorAll('.tab');
|
|||
|
|
let targetTab = null;
|
|||
|
|
|
|||
|
|
for (let i = 0; i < allTabs.length; i++) {
|
|||
|
|
if (allTabs[i].id === tabId) {
|
|||
|
|
// 优先选择前一个tab,如果没有就选择后一个
|
|||
|
|
targetTab = allTabs[i - 1] || allTabs[i + 1];
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (targetTab) {
|
|||
|
|
switchTab(targetTab.id);
|
|||
|
|
} else {
|
|||
|
|
// 如果没有其他tab,激活首页
|
|||
|
|
switchTab('home-tab');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 移除tab和对应的内容
|
|||
|
|
tab.remove();
|
|||
|
|
if (content) {
|
|||
|
|
content.remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 动态加载页面内容
|
|||
|
|
async function loadPageContent(contentType) {
|
|||
|
|
try {
|
|||
|
|
const response = await fetch(`pages/${contentType}.html`);
|
|||
|
|
if (!response.ok) {
|
|||
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|||
|
|
}
|
|||
|
|
const content = await response.text();
|
|||
|
|
return content;
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('加载页面失败:', error);
|
|||
|
|
// 返回默认内容
|
|||
|
|
return `
|
|||
|
|
<div class="page-content">
|
|||
|
|
<h2>页面加载中...</h2>
|
|||
|
|
<p>页面正在开发中,敬请期待...</p>
|
|||
|
|
</div>
|
|||
|
|
`;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 键盘快捷键支持
|
|||
|
|
document.addEventListener('keydown', function(e) {
|
|||
|
|
// ESC键关闭当前tab(除了首页)
|
|||
|
|
if (e.key === 'Escape' && activeTabId !== 'home-tab') {
|
|||
|
|
closeTab(activeTabId);
|
|||
|
|
}
|
|||
|
|
});
|