const appId = 'mirrors-table' // 表格容器ID let appInstance = null // 缓存表格容器引用 let vueApp = null // Vue 应用实例 let isInitializing = false // 是否正在初始化 let lastInitTime = 0 // 上次初始化时间 const INIT_COOLDOWN = 1000 // 初始化冷却时间(毫秒) // 更新表格主题 function updateTableTheme() { const scheme = document.querySelector('[data-md-color-scheme]')?.getAttribute('data-md-color-scheme') const isDarkMode = scheme === 'slate' || scheme === 'dark' // 设置 TDesign 的主题模式 if (isDarkMode) { document.documentElement.setAttribute('theme-mode', 'dark') } else { document.documentElement.removeAttribute('theme-mode') } } // 初始化表格的函数 function initTables() { // 如果正在初始化或者距离上次初始化时间太短,则跳过 const now = Date.now() if (isInitializing || now - lastInitTime < INIT_COOLDOWN) { return } // 使用缓存的引用,如果没有则查询 if (!appInstance) { appInstance = document.getElementById(appId) } // 如果找不到容器,不执行后续操作 if (!appInstance) { return } // 如果表格已经初始化过,且DOM没有变化,则跳过 if (appInstance.hasAttribute('data-initialized')) { return } // console.log('找到表格容器,初始化表格') isInitializing = true lastInitTime = now try { // 清空容器内容,防止重复初始化 while (appInstance.firstChild) { appInstance.removeChild(appInstance.firstChild) } // 确保容器有适当的尺寸 if (!appInstance.style.width) { appInstance.style.width = '100%' } // 确保 Vue 和 TDesign 已加载 if (typeof Vue !== 'undefined' && typeof TDesign !== 'undefined') { // 创建 Vue 应用 const App = Vue.createApp(app) // 注册 TDesign 组件 App.use(TDesign.default) // 挂载应用 vueApp = App.mount(appInstance) // console.log('表格初始化成功') // 标记表格已初始化 appInstance.setAttribute('data-initialized', 'true') // 立即更新主题 updateTableTheme() } else { console.error('Vue 或 TDesign 未加载') // 显示错误消息 const errorDiv = document.createElement('div') errorDiv.style.padding = '20px' errorDiv.style.color = 'red' errorDiv.textContent = 'Vue 或 TDesign 未加载,请在 mkdocs.yml 中添加相应 CDN 链接' appInstance.appendChild(errorDiv) } } catch (error) { console.error('初始化表格时发生错误:', error) } finally { isInitializing = false } } // 初始化 function reinitializeTable() { appInstance = document.getElementById(appId) if (appInstance) { appInstance.removeAttribute('data-initialized') setTimeout(debouncedInit, 300) // 使用更短的延迟 } } // 设置主题监听器 function setupThemeObserver() { // 监听主题变化 const observer = new MutationObserver(() => { updateTableTheme() }) const element = document.querySelector('[data-md-color-scheme]') if (element) { observer.observe(element, { attributes: true, attributeFilter: ['data-md-color-scheme'], }) } else { // 如果元素不存在,等待页面加载完成后重试 setTimeout(setupThemeObserver, 1000) } } // 使用防抖函数包装初始化逻辑 function debounce(func, wait) { let timeout return function () { const context = this const args = arguments clearTimeout(timeout) timeout = setTimeout(() => func.apply(context, args), wait) } } // 列定义 const columns = [ { colKey: 'name', title: '镜像站', align: 'center', width: '160', fixed: 'left' }, { colKey: 'ipv6', title: 'IPv6', align: 'center' }, { colKey: 'epel', title: 'EPEL', align: 'center', tooltip: 'Extra Packages for Enterprise Linux (EPEL) 是由 Fedora 组织维护的一个附加软件包仓库,它主要适用于除 Fedora 操作系统以外的红帽系 Linux 发行版。' }, { colKey: 'archlinux', title: 'Arch Linux', align: 'center' }, { colKey: 'kalilinux', title: 'Kali Linux', align: 'center' }, { colKey: 'armbian', title: 'Armbian', align: 'center' }, { colKey: 'deepin', title: 'Deepin', align: 'center' }, { colKey: 'raspberry', title: 'Raspberry Pi OS', align: 'center', width: '130' }, { colKey: 'linuxmint', title: 'Linux Mint', align: 'center' }, { colKey: 'proxmox', title: 'Proxmox VE', align: 'center' }, { colKey: 'fedora', title: 'Fedora', align: 'center' }, { colKey: 'rockylinux', title: 'Rocky Linux', align: 'center' }, { colKey: 'almalinux', title: 'AlmaLinux', align: 'center' }, { colKey: 'opencloudos', title: 'OpenCloudOS', align: 'center', width: '120' }, { colKey: 'anolis', title: 'Anolis OS', align: 'center' }, { colKey: 'openkylin', title: 'openKylin', align: 'center' }, { colKey: 'alpinelinux', title: 'Alpine Linux', align: 'center' }, { colKey: 'gentoo', title: 'Gentoo', align: 'center' }, { colKey: 'nix', title: 'NixOS', align: 'center' }, ] // 修改 app 对象的模板部分,添加自定义表头渲染 const app = { template: `