Spaces:
Running
Running
// 处理概念卡片点击事件 | |
function handleConceptClick(conceptId) { | |
// 将点击的概念ID传递给Gradio | |
if (typeof gradioApp !== 'undefined') { | |
const app = gradioApp(); | |
const hiddenInput = app.querySelector('#concept-selection'); | |
if (hiddenInput) { | |
hiddenInput.value = conceptId; | |
// 触发change事件 | |
const event = new Event('change'); | |
hiddenInput.dispatchEvent(event); | |
} | |
} | |
} | |
// 添加点击事件监听器到所有概念卡片 | |
function addConceptCardListeners() { | |
const conceptCards = document.querySelectorAll('.concept-card'); | |
conceptCards.forEach(card => { | |
card.addEventListener('click', function() { | |
const conceptId = this.getAttribute('data-concept-id'); | |
if (conceptId) { | |
handleConceptClick(conceptId); | |
// 添加视觉反馈 | |
highlightSelectedCard(this); | |
} | |
}); | |
}); | |
} | |
// 高亮选中的卡片 | |
function highlightSelectedCard(selectedCard) { | |
// 移除所有卡片的高亮 | |
document.querySelectorAll('.concept-card').forEach(card => { | |
card.classList.remove('selected-card'); | |
}); | |
// 添加高亮到选中的卡片 | |
selectedCard.classList.add('selected-card'); | |
} | |
// 在知识图谱节点上添加悬停效果 | |
function addGraphNodeHoverEffects() { | |
const nodes = document.querySelectorAll('#concept-graph svg .node'); | |
nodes.forEach(node => { | |
node.addEventListener('mouseenter', function() { | |
this.classList.add('node-hover'); | |
}); | |
node.addEventListener('mouseleave', function() { | |
this.classList.remove('node-hover'); | |
}); | |
}); | |
} | |
// 增强图像显示 | |
function enhanceImageDisplay() { | |
const graphContainer = document.querySelector('#concept-graph'); | |
if (graphContainer) { | |
const img = graphContainer.querySelector('img'); | |
if (img) { | |
// 确保图像加载完成后应用样式 | |
img.onload = function() { | |
this.style.maxWidth = '100%'; | |
this.style.height = 'auto'; | |
this.style.borderRadius = '8px'; | |
this.style.boxShadow = '0 4px 8px rgba(0,0,0,0.1)'; | |
}; | |
} | |
} | |
} | |
// 在DOM加载完成后初始化 | |
document.addEventListener('DOMContentLoaded', function() { | |
// 知识图谱交互 | |
const conceptGraph = document.querySelector('#concept-graph'); | |
if (conceptGraph) { | |
const img = conceptGraph.querySelector('img'); | |
if (img) { | |
enhanceImageDisplay(); | |
} | |
const nodes = conceptGraph.querySelectorAll('g.node'); | |
nodes.forEach(node => { | |
node.style.cursor = 'pointer'; | |
node.addEventListener('click', function() { | |
const conceptId = this.getAttribute('data-concept-id'); | |
if (conceptId && conceptId !== 'main') { | |
handleConceptClick(conceptId); | |
} | |
}); | |
}); | |
// 添加悬停效果 | |
addGraphNodeHoverEffects(); | |
} | |
// 概念卡片交互 | |
addConceptCardListeners(); | |
// 添加CSS样式 | |
addCustomStyles(); | |
}); | |
// 添加自定义样式 | |
function addCustomStyles() { | |
const style = document.createElement('style'); | |
style.textContent = ` | |
/* 通用样式设置,支持中文 */ | |
body { | |
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif; | |
} | |
/* 概念卡片样式 */ | |
.concept-card { | |
transition: all 0.3s ease; | |
border: 1px solid #ddd; | |
border-radius: 8px; | |
padding: 12px; | |
margin-bottom: 10px; | |
cursor: pointer; | |
} | |
.concept-card:hover { | |
box-shadow: 0 2px 12px rgba(0,0,0,0.15); | |
transform: translateY(-2px); | |
} | |
.selected-card { | |
border-color: #2196F3; | |
background-color: rgba(33, 150, 243, 0.05); | |
box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.3); | |
} | |
.concept-title { | |
font-weight: bold; | |
margin-bottom: 5px; | |
} | |
.concept-desc { | |
font-size: 0.9em; | |
color: #555; | |
} | |
/* 图表节点样式 */ | |
.node-hover { | |
opacity: 0.8; | |
transform: scale(1.05); | |
} | |
/* 知识图谱容器样式 */ | |
#concept-graph img { | |
max-width: 100%; | |
height: auto; | |
border-radius: 8px; | |
box-shadow: 0 4px 8px rgba(0,0,0,0.1); | |
} | |
`; | |
document.head.appendChild(style); | |
} | |
// Gradio元素变化时重新添加监听器 | |
// 这是必要的,因为Gradio可能会动态替换DOM元素 | |
const observer = new MutationObserver(function(mutations) { | |
mutations.forEach(function(mutation) { | |
if (mutation.addedNodes && mutation.addedNodes.length > 0) { | |
// 检查是否有新的概念卡片添加 | |
for (let i = 0; i < mutation.addedNodes.length; i++) { | |
const node = mutation.addedNodes[i]; | |
if (node.classList && node.classList.contains('concept-card')) { | |
addConceptCardListeners(); | |
break; | |
} | |
} | |
// 检查是否有新的知识图谱添加 | |
const conceptGraph = document.querySelector('#concept-graph'); | |
if (conceptGraph) { | |
addGraphNodeHoverEffects(); | |
enhanceImageDisplay(); | |
} | |
} | |
}); | |
}); | |
// 开始观察DOM变化 | |
window.addEventListener('load', function() { | |
const targetNode = document.getElementById('concept-cards'); | |
if (targetNode) { | |
observer.observe(targetNode, { childList: true, subtree: true }); | |
} | |
// 也观察知识图谱容器 | |
const graphContainer = document.getElementById('concept-graph'); | |
if (graphContainer) { | |
observer.observe(graphContainer, { childList: true, subtree: true }); | |
} | |
}); |