File size: 3,759 Bytes
e1ae2c6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | const initUi = require('./ui');
const initSearch = require('./search');
const initRouting = require('./routing');
function detectHomePageId() {
// 首页不再固定为 "home":以导航顺序第一项为准
// 1) 优先从生成端注入的配置数据读取(保持与实际导航顺序一致)
try {
const config =
window.MeNav && typeof window.MeNav.getConfig === 'function'
? window.MeNav.getConfig()
: null;
const injectedHomePageId =
config && config.data && config.data.homePageId ? String(config.data.homePageId).trim() : '';
if (injectedHomePageId) return injectedHomePageId;
const nav =
config && config.data && Array.isArray(config.data.navigation)
? config.data.navigation
: null;
const firstId = nav && nav[0] && nav[0].id ? String(nav[0].id).trim() : '';
if (firstId) return firstId;
} catch (error) {
// 忽略解析错误,继续使用 DOM 推断
}
// 2) 回退到 DOM:取首个导航项的 data-page
const firstNavItem = document.querySelector('.nav-item[data-page]');
if (firstNavItem) {
const id = String(firstNavItem.getAttribute('data-page') || '').trim();
if (id) return id;
}
// 3) 最后兜底:取首个页面容器 id
const firstPage = document.querySelector('.page[id]');
if (firstPage && firstPage.id) return firstPage.id;
return 'home';
}
document.addEventListener('DOMContentLoaded', () => {
const homePageId = detectHomePageId();
const state = {
homePageId,
currentPageId: homePageId,
isInitialLoad: true,
isSidebarOpen: false,
isLightTheme: false,
isSidebarCollapsed: false,
pages: null,
currentSearchEngine: 'local',
isSearchActive: false,
searchIndex: {
initialized: false,
items: [],
},
};
// 获取 DOM 元素 - 基本元素
const searchInput = document.getElementById('search');
const searchBox = document.querySelector('.search-box');
const searchResultsPage = document.getElementById('search-results');
const searchSections = searchResultsPage.querySelectorAll('.search-section');
// 搜索引擎相关元素
const searchEngineToggle = document.querySelector('.search-engine-toggle');
const searchEngineToggleIcon = searchEngineToggle
? searchEngineToggle.querySelector('.search-engine-icon')
: null;
const searchEngineToggleLabel = searchEngineToggle
? searchEngineToggle.querySelector('.search-engine-label')
: null;
const searchEngineDropdown = document.querySelector('.search-engine-dropdown');
const searchEngineOptions = document.querySelectorAll('.search-engine-option');
// 移动端元素
const menuToggle = document.querySelector('.menu-toggle');
const searchToggle = document.querySelector('.search-toggle');
const sidebar = document.querySelector('.sidebar');
const searchContainer = document.querySelector('.search-container');
const overlay = document.querySelector('.overlay');
// 侧边栏折叠功能
const sidebarToggle = document.querySelector('.sidebar-toggle');
const content = document.querySelector('.content');
// 主题切换元素
const themeToggle = document.querySelector('.theme-toggle');
const themeIcon = themeToggle.querySelector('i');
const dom = {
searchInput,
searchBox,
searchResultsPage,
searchSections,
searchEngineToggle,
searchEngineToggleIcon,
searchEngineToggleLabel,
searchEngineDropdown,
searchEngineOptions,
menuToggle,
searchToggle,
sidebar,
searchContainer,
overlay,
sidebarToggle,
content,
themeToggle,
themeIcon,
};
const ui = initUi(state, dom);
const search = initSearch(state, dom);
initRouting(state, dom, { ui, search });
});
|