// concept_interaction.js - 处理概念卡片的交互 // 页面加载完成后初始化交互 document.addEventListener('DOMContentLoaded', function() { console.log('概念交互模块已加载'); setupConceptCardInteractions(); setupImageEnhancements(); }); // 设置概念卡片交互 function setupConceptCardInteractions() { // 使用事件委托处理所有卡片点击 document.body.addEventListener('click', function(event) { const card = event.target.closest('.concept-card'); if (!card) return; const conceptId = card.getAttribute('data-concept-id'); if (!conceptId) { console.error('卡片没有设置 data-concept-id 属性'); return; } console.log(`点击了概念卡片: ${conceptId}`); // 显示加载动画 showLoadingInDetailPanel(); // 更新选中状态 updateSelectedCard(card); // 触发 Gradio 事件 triggerConceptSelection(conceptId); }); } // 在详情面板显示加载动画 function showLoadingInDetailPanel() { const detailContainer = document.querySelector('.concept-detail-box'); if (detailContainer) { detailContainer.innerHTML = `
正在生成概念详细解释...
`; } } // 更新选中的卡片样式 function updateSelectedCard(selectedCard) { document.querySelectorAll('.concept-card').forEach(card => { card.classList.remove('selected-card'); }); selectedCard.classList.add('selected-card'); } // 触发 Gradio 输入事件 function triggerConceptSelection(conceptId) { const conceptSelection = document.getElementById('concept-selection'); if (conceptSelection) { conceptSelection.value = conceptId; // 使用 input 事件,更可靠地触发 Gradio conceptSelection.dispatchEvent(new Event('input', { bubbles: true })); console.log(`已触发概念选择事件: ${conceptId}`); } else { console.error('找不到概念选择输入框 (concept-selection)'); } } // 增强图像显示 function setupImageEnhancements() { const graphContainer = document.getElementById('concept-graph'); if (!graphContainer) return; // 监视节点变化 const observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.type === 'childList') { const img = graphContainer.querySelector('img'); if (img) { enhanceImage(img); } } }); }); observer.observe(graphContainer, { childList: true, subtree: true }); } // 增强图像显示效果 function enhanceImage(img) { img.style.maxWidth = '100%'; img.style.height = 'auto'; img.style.borderRadius = '8px'; img.style.boxShadow = '0 4px 8px rgba(0,0,0,0.1)'; img.style.transition = 'transform 0.3s ease, box-shadow 0.3s ease'; // 添加悬停效果 img.onmouseover = function() { this.style.transform = 'scale(1.01)'; this.style.boxShadow = '0 6px 12px rgba(0,0,0,0.15)'; }; img.onmouseout = function() { this.style.transform = 'scale(1)'; this.style.boxShadow = '0 4px 8px rgba(0,0,0,0.1)'; }; } // 诊断功能:检查所有概念卡片ID function checkAllConceptCards() { const cards = document.querySelectorAll('.concept-card'); console.log(`发现 ${cards.length} 个概念卡片`); const idMap = {}; cards.forEach((card, index) => { const id = card.getAttribute('data-concept-id'); console.log(`卡片 #${index + 1}: ID=${id}`); if (id) { idMap[id] = (idMap[id] || 0) + 1; } }); // 检查ID是否有重复 const duplicates = Object.entries(idMap).filter(([id, count]) => count > 1); if (duplicates.length > 0) { console.error('发现重复的概念ID:', duplicates); } return { totalCards: cards.length, cardsWithIds: Object.keys(idMap).length, duplicateIds: duplicates.map(([id]) => id) }; } // 提供全局诊断接口 window.diagnoseConcepts = checkAllConceptCards; // 添加调试和错误日志 window.addEventListener('error', function(e) { console.error('🔴 JavaScript 错误:', e.message, 'at', e.filename, 'line', e.lineno); });