// 夜间模式功能 let darkModeToggle; let viewModeToggle; let currentViewMode = 1; // 默认为分组展示(1),卡片展示(2) let applyFiltersFunction; // 用于存储applyFilters函数引用 let domainsData = []; // 存储所有域名数据 // 创建域名卡片的全局函数 function createDomainCard(domain) { if (!domain) { console.error('域名数据为空'); return document.createElement('div'); } // 创建域名卡片元素 const domainCard = document.createElement('div'); domainCard.className = `domain-card ${getRegistrarClass(domain.注册商)}`; // 判断是否为非卖域名和是否可购买 const isPremium = domain.非卖 === "是"; const isAvailable = domain.可购买 === "是"; // 如果是收藏(非卖)域名,添加特殊类名 if (isPremium) { domainCard.classList.add('domain-card-favorite'); } // 格式化日期 const expiryDate = formatDate(domain.到期); // 设置价格类和按钮类 const priceClass = isPremium ? 'premium-price' : ''; const buttonClass = isPremium ? 'buy-btn unavailable premium' : (isAvailable ? 'buy-btn' : 'buy-btn unavailable'); const buttonText = isPremium ? '收藏' : (isAvailable ? '购买' : '已售'); // 获取注册商首字母和颜色 const firstLetter = getFirstLetter(domain.注册商); const bgColor = getRegistrarColor(domain.注册商); // 设置卡片内容 domainCard.innerHTML = `
${firstLetter} ${domain.注册商}
到期: ${expiryDate}
${domain.前缀}${domain.后缀}
`; return domainCard; } // 获取中文拼音首字母 function getFirstLetter(str) { if (!str) return 'A'; // 如果是英文,直接返回第一个字母 if (/^[A-Za-z]/.test(str)) { return str.charAt(0).toUpperCase(); } // 如果是中文,直接返回第一个字符 return str.charAt(0); } // 为注册商分配固定颜色 function getRegistrarColor(registrar) { // 预定义一组好看的颜色 const colors = [ '#3498db', // 蓝色 '#2ecc71', // 绿色 '#e74c3c', // 红色 '#f39c12', // 橙色 '#9b59b6', // 紫色 '#1abc9c', // 青绿色 '#d35400', // 深橙色 '#c0392b', // 深红色 '#16a085', // 深青色 '#8e44ad', // 深紫色 '#27ae60', // 深绿色 '#2980b9', // 深蓝色 '#f1c40f', // 黄色 '#e67e22', // 橙黄色 '#34495e' // 深灰蓝色 ]; // 为常见注册商分配固定颜色 const registrarColors = { 'GoDaddy': '#2980b9', // 深蓝色 'Namecheap': '#e74c3c', // 红色 'Alibaba': '#f39c12', // 橙色 '阿里云': '#f39c12', // 橙色 '西部数码': '#2ecc71' // 绿色 }; // 如果是已知注册商,返回固定颜色 if (registrarColors[registrar]) { return registrarColors[registrar]; } // 对于未知注册商,使用字符串哈希生成固定索引 let hash = 0; for (let i = 0; i < registrar.length; i++) { hash = registrar.charCodeAt(i) + ((hash << 5) - hash); } // 确保索引在颜色数组范围内 const index = Math.abs(hash) % colors.length; return colors[index]; } // 获取注册商对应的CSS类 function getRegistrarClass(registrar) { if (!registrar) { console.error('注册商为空'); return ''; } const registrarMap = { 'GoDaddy': 'card-godaddy', 'Namecheap': 'card-namecheap', 'Alibaba': 'card-alibaba', '西部数码': 'card-west' }; return registrarMap[registrar] || ''; } // 格式化价格 function formatPrice(price) { if (price === undefined || isNaN(price)) { console.error('价格格式错误:', price); return '¥0.00'; } return `¥${Number(price).toFixed(2)}`; } // 格式化日期 function formatDate(dateString) { if (!dateString) { console.error('日期格式错误:', dateString); return '未知'; } try { const date = new Date(dateString); if (isNaN(date.getTime())) { console.error('无效日期:', dateString); return '未知'; } return date.toLocaleDateString('zh-CN'); } catch (error) { console.error('日期格式化错误:', error); return '未知'; } } // 初始化夜间模式 function initDarkMode() { console.log('开始初始化夜间模式'); // 获取按钮元素 darkModeToggle = document.getElementById('darkModeToggle'); // 检查按钮是否存在 if (!darkModeToggle) { console.error('找不到夜间模式切换按钮,ID: darkModeToggle'); return; } console.log('找到夜间模式按钮:', darkModeToggle); // 检查本地存储中的夜间模式设置 const isDarkMode = localStorage.getItem('darkMode') === '1'; console.log('当前夜间模式状态:', isDarkMode); // 应用夜间模式设置 if (isDarkMode) { document.body.classList.add('dark-mode'); darkModeToggle.innerHTML = ''; } // 将toggleDarkMode添加到全局作用域 window.toggleDarkMode = toggleDarkMode; console.log('已添加夜间模式切换事件'); } // 初始化展示方式切换 function initViewMode() { console.log('开始初始化展示方式切换'); // 获取按钮元素 viewModeToggle = document.getElementById('viewModeToggle'); // 检查按钮是否存在 if (!viewModeToggle) { console.error('找不到展示方式切换按钮,ID: viewModeToggle'); return; } console.log('找到展示方式切换按钮:', viewModeToggle); // 读取展示方式设置 // 1. 优先从本地存储读取用户设置 // 2. 如果本地存储没有设置,则尝试从JSON配置中读取 // 3. 如果都没有,则使用默认值1(分组视图) const savedViewMode = localStorage.getItem('viewMode'); if (savedViewMode) { currentViewMode = parseInt(savedViewMode); console.log('从本地存储读取展示方式:', currentViewMode); } else if (window.siteConfig && window.siteConfig.展示方式 && window.siteConfig.展示方式.当前模式 !== undefined) { currentViewMode = parseInt(window.siteConfig.展示方式.当前模式); console.log('从JSON配置读取展示方式:', currentViewMode); localStorage.setItem('viewMode', currentViewMode.toString()); } else { console.log('使用默认展示方式:1(分组视图)'); } // 更新图标 updateViewModeIcon(); // 应用视图模式 if (currentViewMode === 1) { // 分组视图 document.body.classList.add('grouped-view-mode'); document.body.classList.remove('card-view-mode'); } else { // 卡片视图 document.body.classList.add('card-view-mode'); document.body.classList.remove('grouped-view-mode'); } // 将toggleViewMode添加到全局作用域 window.toggleViewMode = toggleViewMode; console.log('已添加展示方式切换事件'); } // 切换夜间模式 function toggleDarkMode() { console.log('执行夜间模式切换函数'); if (!darkModeToggle) { console.error('切换夜间模式时找不到按钮'); darkModeToggle = document.getElementById('darkModeToggle'); if (!darkModeToggle) { return; } } const isDarkMode = document.body.classList.toggle('dark-mode'); console.log('切换后的夜间模式状态:', isDarkMode); // 更新图标 darkModeToggle.innerHTML = isDarkMode ? '' : ''; // 保存设置到本地存储 localStorage.setItem('darkMode', isDarkMode ? '1' : '0'); console.log('夜间模式设置已保存到本地存储'); // 添加视觉反馈 darkModeToggle.classList.add('clicked'); setTimeout(() => { darkModeToggle.classList.remove('clicked'); }, 300); return false; // 阻止默认行为 } // 切换展示方式 function toggleViewMode() { console.log('执行展示方式切换函数'); if (!viewModeToggle) { console.error('切换展示方式时找不到按钮'); viewModeToggle = document.getElementById('viewModeToggle'); if (!viewModeToggle) { return; } } // 切换展示方式:1(分组) <-> 2(卡片) currentViewMode = currentViewMode === 1 ? 2 : 1; console.log('切换后的展示方式:', currentViewMode); // 保存设置到本地存储 localStorage.setItem('viewMode', currentViewMode.toString()); console.log('展示方式设置已保存到本地存储'); // 更新图标 updateViewModeIcon(); // 添加视觉反馈 viewModeToggle.classList.add('clicked'); setTimeout(() => { viewModeToggle.classList.remove('clicked'); }, 300); // 应用视图模式 if (currentViewMode === 1) { // 分组视图 document.body.classList.add('grouped-view-mode'); document.body.classList.remove('card-view-mode'); } else { // 卡片视图 document.body.classList.add('card-view-mode'); document.body.classList.remove('grouped-view-mode'); } // 尝试获取全局存储的域名数据 let domains = []; if (window.domainsData && Array.isArray(window.domainsData)) { domains = window.domainsData; } else if (domainsData && Array.isArray(domainsData)) { domains = domainsData; } if (domains.length === 0) { console.error('无法获取域名数据,将刷新页面'); location.reload(); return false; } // 重新应用筛选并渲染 try { // 尝试获取domainsContainer const domainsContainer = document.getElementById('domainsContainer'); if (!domainsContainer) { throw new Error('找不到域名容器'); } // 保存当前滚动位置 const scrollPosition = window.scrollY; // 清空容器 domainsContainer.innerHTML = ''; // 重新渲染当前视图 if (currentViewMode === 1) { console.log('渲染分组视图,域名数量:', domains.length); // 按后缀对域名进行分组 const domainsByTld = {}; domains.forEach(domain => { if (!domainsByTld[domain.后缀]) { domainsByTld[domain.后缀] = []; } domainsByTld[domain.后缀].push(domain); }); // 遍历每个后缀分组 Object.keys(domainsByTld).forEach(tld => { const tldDomains = domainsByTld[tld]; // 创建后缀分组标题 const tldHeader = document.createElement('div'); tldHeader.className = 'tld-header'; tldHeader.setAttribute('data-tld', tld); tldHeader.innerHTML = `

${tld}

${tldDomains.length} 个域名 `; // 创建域名容器 const tldContainer = document.createElement('div'); tldContainer.className = 'domains-group'; // 将标题和容器添加到主容器 domainsContainer.appendChild(tldHeader); domainsContainer.appendChild(tldContainer); // 为每个域名创建卡片 tldDomains.forEach(domain => { // 创建域名卡片 const domainCard = createDomainCard(domain); // 将卡片添加到当前后缀容器 tldContainer.appendChild(domainCard); }); }); } else { console.log('渲染卡片视图,域名数量:', domains.length); // 卡片展示模式 domains.forEach(domain => { // 创建域名卡片 const domainCard = createDomainCard(domain); // 将卡片添加到容器 domainsContainer.appendChild(domainCard); }); } // 恢复滚动位置 window.scrollTo(0, scrollPosition); } catch (error) { console.error('重新渲染视图失败:', error); // 如果出错,尝试刷新页面 location.reload(); } return false; // 阻止默认行为 } // 更新展示方式图标 function updateViewModeIcon() { if (!viewModeToggle) return; viewModeToggle.innerHTML = currentViewMode === 1 ? '' : ''; } // 当DOM加载完成后初始化夜间模式和展示方式 document.addEventListener('DOMContentLoaded', function() { console.log('DOM已加载完成,准备初始化功能'); initDarkMode(); initViewMode(); }); document.addEventListener('DOMContentLoaded', () => { // 获取DOM元素 const domainsContainer = document.getElementById('domainsContainer'); const filterButtons = document.querySelectorAll('.filter-btn'); const domainTabs = document.querySelectorAll('.domain-tab'); const qrModal = document.getElementById('qrModal'); const closeModal = document.getElementById('closeModal'); const modalDomainName = document.getElementById('modalDomainName'); const modalDomainPrice = document.getElementById('modalDomainPrice'); const qrCodeImage = document.getElementById('qrCodeImage'); // 获取筛选器元素 const registrarFilter = document.getElementById('registrarFilter'); const tldFilter = document.getElementById('tldFilter'); // 获取统计元素 const totalDomainsEl = document.getElementById('totalDomains'); const availableDomainsEl = document.getElementById('availableDomains'); const soldDomainsEl = document.getElementById('soldDomains'); // 获取标签计数元素 const tabCountAll = document.getElementById('tabCountAll'); const tabCountAvailable = document.getElementById('tabCountAvailable'); const tabCountSold = document.getElementById('tabCountSold'); const tabCountFavorite = document.getElementById('tabCountFavorite'); // 存储网站配置 let siteConfig = {}; // 当前筛选条件 let currentFilters = { status: 'all', registrar: 'all', tld: 'all' }; // 获取域名数据 fetchDomains(); // 使用Fetch API获取域名数据 async function fetchDomains() { try { const response = await fetch('domains.json'); if (!response.ok) { throw new Error(`HTTP 错误! 状态: ${response.status}`); } const data = await response.json(); console.log('获取到的数据:', data); // 添加日志输出查看数据 // 设置网站配置 siteConfig = data.网站配置 || {}; // 将配置存储到全局变量 window.siteConfig = siteConfig; console.log('网站配置:', siteConfig); applySiteConfig(); // 获取域名列表 domainsData = data.域名列表 || []; console.log('解析后的域名数据:', domainsData); // 检查域名列表是否正确获取 // 确保domainsData是数组 if (!Array.isArray(domainsData)) { console.error('域名数据不是数组:', domainsData); domainsData = []; } // 将域名数据存储到全局变量 window.domainsData = domainsData; // 填充后缀下拉菜单 populateTldOptions(); // 填充注册商下拉菜单 populateRegistrarOptions(); // 应用初始筛选并渲染 applyFilters(); updateDomainStats(domainsData); } catch (error) { console.error('获取域名数据时出错:', error); domainsContainer.innerHTML = `

加载域名数据时出错。请稍后再试。

错误详情: ${error.message}

`; } } // 填充后缀下拉菜单(从数据中提取) function populateTldOptions() { if (!tldFilter) return; // 获取所有不重复的后缀 const tlds = [...new Set(domainsData.map(domain => domain.后缀))]; // 清空现有选项(保留"全部"选项) while (tldFilter.options.length > 1) { tldFilter.remove(1); } // 添加后缀选项 tlds.forEach(tld => { const option = document.createElement('option'); option.value = tld; option.textContent = tld; tldFilter.appendChild(option); }); } // 填充注册商下拉菜单(从数据中提取) function populateRegistrarOptions() { if (!registrarFilter) return; // 获取所有不重复的注册商 const registrars = [...new Set(domainsData.map(domain => domain.注册商))]; // 清空现有选项(保留"全部"选项) while (registrarFilter.options.length > 1) { registrarFilter.remove(1); } // 添加注册商选项 registrars.forEach(registrar => { const option = document.createElement('option'); option.value = registrar; option.textContent = registrar; registrarFilter.appendChild(option); }); } // 更新域名统计信息 function updateDomainStats(domains) { console.log('更新统计信息,域名数量:', domains.length); // 添加日志 // 计算总域名数 const totalCount = domains.length; // 计算待售域名数(可购买且非"非卖"的域名) const availableCount = domains.filter(domain => domain.可购买 === "是" && domain.非卖 === "否" ).length; // 计算已售域名数(不可购买的域名) const soldCount = domains.filter(domain => domain.可购买 === "否" ).length; // 计算收藏域名数(非卖域名) const favoriteCount = domains.filter(domain => domain.非卖 === "是" ).length; console.log('统计结果:', { 总域名: totalCount, 待售: availableCount, 已售: soldCount, 收藏: favoriteCount }); // 添加日志 // 更新统计卡片 if (totalDomainsEl) totalDomainsEl.textContent = totalCount; if (availableDomainsEl) availableDomainsEl.textContent = availableCount; if (soldDomainsEl) soldDomainsEl.textContent = soldCount; // 更新标签计数 if (tabCountAll) tabCountAll.textContent = totalCount; if (tabCountAvailable) tabCountAvailable.textContent = availableCount; if (tabCountSold) tabCountSold.textContent = soldCount; if (tabCountFavorite) tabCountFavorite.textContent = favoriteCount; } // 应用网站配置 function applySiteConfig() { const container = document.querySelector('.container'); if (!container) { console.error('未找到主容器'); return; } if (window.siteConfig) { // 设置浏览器标签页标题 if (window.siteConfig.标题) { document.title = window.siteConfig.标题; } // 更新页面上的标题 const pageTitle = document.getElementById('pageTitle'); if (pageTitle) { // 使用页面标题文本字段(如果存在),否则使用标题字段 if (window.siteConfig.页面标题文本 !== undefined) { pageTitle.textContent = window.siteConfig.页面标题文本; } else if (window.siteConfig.标题) { pageTitle.textContent = window.siteConfig.标题; } // 处理标题的显示/隐藏 if (window.siteConfig.显示标题 !== undefined) { pageTitle.style.display = window.siteConfig.显示标题 === 1 ? 'block' : 'none'; } } if (window.siteConfig.图标) { // 检查是否已有favicon let favicon = document.querySelector('link[rel="icon"]'); if (!favicon) { favicon = document.createElement('link'); favicon.rel = 'icon'; document.head.appendChild(favicon); } favicon.href = window.siteConfig.图标; } // 应用夜间模式设置 if (window.siteConfig.夜间模式 !== undefined) { // 如果本地存储中没有设置,则使用JSON中的默认设置 if (localStorage.getItem('darkMode') === null) { const isDarkMode = window.siteConfig.夜间模式 === 1; localStorage.setItem('darkMode', window.siteConfig.夜间模式.toString()); if (isDarkMode) { document.body.classList.add('dark-mode'); const darkModeToggle = document.getElementById('darkModeToggle'); if (darkModeToggle) { darkModeToggle.innerHTML = ''; } } } } // 应用展示方式设置 if (window.siteConfig.展示方式 && window.siteConfig.展示方式.当前模式 !== undefined) { // 如果本地存储中没有设置,则使用JSON中的默认设置 if (localStorage.getItem('viewMode') === null) { currentViewMode = parseInt(window.siteConfig.展示方式.当前模式); localStorage.setItem('viewMode', currentViewMode.toString()); console.log('从JSON配置中设置展示方式:', currentViewMode); // 更新视图模式按钮图标 updateViewModeIcon(); // 应用视图模式 if (currentViewMode === 1) { // 分组视图 document.body.classList.add('grouped-view-mode'); document.body.classList.remove('card-view-mode'); } else { // 卡片视图 document.body.classList.add('card-view-mode'); document.body.classList.remove('grouped-view-mode'); } } } // 应用界面设置 applyInterfaceSettings(); // 应用友情链接 applyFriendLinks(); } } // 应用界面设置 function applyInterfaceSettings() { // 默认使用分组视图 document.body.classList.add('grouped-view-mode'); document.body.classList.remove('card-view-mode'); // 添加筛选器事件 if (registrarFilter) { registrarFilter.addEventListener('change', function() { currentFilters.registrar = this.value; applyFilters(); }); } if (tldFilter) { tldFilter.addEventListener('change', function() { currentFilters.tld = this.value; applyFilters(); }); } // 添加域名状态标签事件 domainTabs.forEach(tab => { tab.addEventListener('click', function() { // 移除所有标签的active类 domainTabs.forEach(t => t.classList.remove('active')); // 添加当前标签的active类 this.classList.add('active'); // 更新当前筛选状态 currentFilters.status = this.dataset.filter; // 应用筛选 applyFilters(); }); }); // 添加筛选按钮事件 filterButtons.forEach(button => { button.addEventListener('click', function() { // 移除所有按钮的active类 filterButtons.forEach(btn => btn.classList.remove('active')); // 添加当前按钮的active类 this.classList.add('active'); // 应用筛选 filterDomains(this.dataset.filter); }); }); // 添加模态框关闭事件 if (closeModal) { closeModal.addEventListener('click', () => { qrModal.style.display = 'none'; }); } // 点击模态框外部关闭 window.addEventListener('click', (event) => { if (event.target === qrModal) { qrModal.style.display = 'none'; } }); } // 渲染域名卡片 function renderDomains(domains) { // 清空容器 domainsContainer.innerHTML = ''; // 检查是否有数据 if (domains.length === 0) { domainsContainer.innerHTML = '

没有找到符合条件的域名。

'; return; } // 根据当前展示方式选择渲染方法 if (currentViewMode === 1) { // 分组展示模式 renderGroupedDomains(domains); // 移除卡片模式类 document.body.classList.remove('card-view-mode'); document.body.classList.add('grouped-view-mode'); } else { // 卡片展示模式 renderCardDomains(domains); // 添加卡片模式类 document.body.classList.add('card-view-mode'); document.body.classList.remove('grouped-view-mode'); } } // 分组展示模式渲染 function renderGroupedDomains(domains) { // 按后缀对域名进行分组 const domainsByTld = {}; domains.forEach(domain => { if (!domainsByTld[domain.后缀]) { domainsByTld[domain.后缀] = []; } domainsByTld[domain.后缀].push(domain); }); // 遍历每个后缀分组 Object.keys(domainsByTld).forEach(tld => { const tldDomains = domainsByTld[tld]; // 创建后缀分组标题 const tldHeader = document.createElement('div'); tldHeader.className = 'tld-header'; tldHeader.setAttribute('data-tld', tld); tldHeader.innerHTML = `

${tld}

${tldDomains.length} 个域名 `; // 创建域名容器 const tldContainer = document.createElement('div'); tldContainer.className = 'domains-group'; // 将标题和容器添加到主容器 domainsContainer.appendChild(tldHeader); domainsContainer.appendChild(tldContainer); // 为每个域名创建卡片 tldDomains.forEach(domain => { // 创建域名卡片 const domainCard = createDomainCard(domain); // 将卡片添加到当前后缀容器 tldContainer.appendChild(domainCard); }); }); } // 卡片展示模式渲染 function renderCardDomains(domains) { // 直接渲染所有域名卡片,不分组 domains.forEach(domain => { // 创建域名卡片 const domainCard = createDomainCard(domain); // 将卡片添加到容器 domainsContainer.appendChild(domainCard); }); } // 全局函数,用于显示模态框 window.showModal = function(domainId) { // 获取域名数据 const domain = domainsData.find(d => d.id === domainId); if (!domain) return; console.log('显示模态框', domain.前缀 + domain.后缀, domain.价格); // 设置模态框内容 modalDomainName.textContent = domain.前缀 + domain.后缀; modalDomainPrice.textContent = formatPrice(domain.价格); // 设置二维码图片 - 使用固定的lx.png qrCodeImage.src = 'images/qrcodes/lx.png'; qrCodeImage.style.display = 'block'; // 显示模态框 qrModal.style.display = 'flex'; document.body.style.overflow = 'hidden'; }; // 关闭模态框按钮事件 closeModal.addEventListener('click', () => { qrModal.style.display = 'none'; document.body.style.overflow = ''; }); // 点击模态框外部关闭模态框 qrModal.addEventListener('click', (e) => { if (e.target === qrModal) { qrModal.style.display = 'none'; document.body.style.overflow = ''; } }); // ESC键关闭模态框 document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && qrModal.style.display === 'flex') { qrModal.style.display = 'none'; document.body.style.overflow = ''; } }); // 应用所有筛选条件 function applyFilters() { // 根据当前的筛选条件筛选域名 let filteredDomains = domainsData; // 根据状态筛选 if (currentFilters.status === 'available') { filteredDomains = filteredDomains.filter(domain => domain.可购买 === "是" && domain.非卖 === "否" ); } else if (currentFilters.status === 'premium' || currentFilters.status === 'favorite') { filteredDomains = filteredDomains.filter(domain => domain.非卖 === "是" ); } else if (currentFilters.status === 'sold') { filteredDomains = filteredDomains.filter(domain => domain.可购买 === "否" ); } // 根据注册商筛选 if (currentFilters.registrar !== 'all') { filteredDomains = filteredDomains.filter(domain => domain.注册商 === currentFilters.registrar ); } // 根据后缀筛选 if (currentFilters.tld !== 'all') { filteredDomains = filteredDomains.filter(domain => domain.后缀 === currentFilters.tld ); } // 渲染筛选后的域名 renderDomains(filteredDomains); } // 筛选域名的通用函数(旧版本,保留向后兼容性) function filterDomains(filter) { currentFilters.status = filter; applyFilters(); } // 将applyFilters函数存储到全局变量中 applyFiltersFunction = applyFilters; // 应用友情链接 function applyFriendLinks() { if (!window.siteConfig || !window.siteConfig.界面设置 || !window.siteConfig.界面设置.友情链接) { console.log('未找到友情链接配置'); return; } const friendLinksConfig = window.siteConfig.界面设置.友情链接; const friendLinksContainer = document.getElementById('friendLinksContainer'); const friendLinksList = document.getElementById('friendLinksList'); if (!friendLinksContainer || !friendLinksList) { console.error('未找到友情链接容器'); return; } // 如果配置为隐藏,则不显示友情链接部分 if (friendLinksConfig.显示 !== 1) { friendLinksContainer.style.display = 'none'; return; } // 显示友情链接部分 friendLinksContainer.style.display = 'block'; // 设置标题 const titleElement = friendLinksContainer.querySelector('.friend-links-title'); if (titleElement && friendLinksConfig.标题) { titleElement.textContent = friendLinksConfig.标题; } // 清空现有链接 friendLinksList.innerHTML = ''; // 为链接网站分配固定颜色 const linkColors = { '阿里云': '#FF6A00', '腾讯云': '#2980b9', '华为云': '#C7000B', '西部数码': '#2ecc71', '百度智能云': '#3388FF' }; // 生成固定颜色的函数(与注册商颜色生成类似) function getLinkColor(name) { // 预定义一组好看的颜色 const colors = [ '#3498db', // 蓝色 '#2ecc71', // 绿色 '#e74c3c', // 红色 '#f39c12', // 橙色 '#9b59b6', // 紫色 '#1abc9c', // 青绿色 '#d35400', // 深橙色 '#c0392b', // 深红色 '#16a085', // 深青色 '#8e44ad', // 深紫色 '#27ae60', // 深绿色 '#2980b9', // 深蓝色 '#f1c40f', // 黄色 '#e67e22', // 橙黄色 '#34495e' // 深灰蓝色 ]; // 如果是已知网站,返回固定颜色 if (linkColors[name]) { return linkColors[name]; } // 对于未知网站,使用字符串哈希生成固定索引 let hash = 0; for (let i = 0; i < name.length; i++) { hash = name.charCodeAt(i) + ((hash << 5) - hash); } // 确保索引在颜色数组范围内 const index = Math.abs(hash) % colors.length; return colors[index]; } // 获取首字母的函数(与注册商首字母获取类似) function getFirstLetter(str) { if (!str) return 'A'; // 如果是英文,直接返回第一个字母 if (/^[A-Za-z]/.test(str)) { return str.charAt(0).toUpperCase(); } // 如果是中文,直接返回第一个字符 return str.charAt(0); } // 添加链接 if (friendLinksConfig.链接列表 && Array.isArray(friendLinksConfig.链接列表)) { friendLinksConfig.链接列表.forEach(link => { if (link.名称 && link.网址) { const linkElement = document.createElement('a'); linkElement.href = link.网址; linkElement.className = 'friend-link'; linkElement.textContent = link.名称; linkElement.title = link.描述 || link.名称; linkElement.target = '_blank'; // 在新标签页打开 linkElement.rel = 'noopener noreferrer'; // 安全设置 // 设置首字母图标的样式 const firstLetter = getFirstLetter(link.名称); const bgColor = getLinkColor(link.名称); // 使用CSS自定义属性设置首字母和颜色 linkElement.style.setProperty('--first-letter', `"${firstLetter}"`); linkElement.style.setProperty('--bg-color', bgColor); // 或者使用内联样式 linkElement.style.cssText = `--first-letter: "${firstLetter}"; --bg-color: ${bgColor};`; // 为不同网站设置不同背景色 linkElement.style.borderLeftColor = bgColor; friendLinksList.appendChild(linkElement); } }); } } });