// ==================== 数据加载函数 ==================== async function loadParameters() { if (cachedParams) return cachedParams; try { const res = await fetch('10_b1_params.php'); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json(); if (data.error) throw new Error(data.error); cachedParams = data; return data; } catch (err) { console.error('加载参数失败:', err); throw new Error('参数API请求失败: ' + err.message); } } async function loadDynamicIndicatorsForAllSymbols() { if (!activeSource || !cachedData) { return { error: '动态指标:基于已获取的K线数据,请先点击MEXC或Binance按钮获取K线数据' }; } const symbols = Object.keys(cachedData); const promises = symbols.map(async (sym) => { try { const url = `11_dynamic_indicators.php?source=${activeSource}&symbol=${sym}`; const res = await fetch(url); const data = await res.json(); return { symbol: sym, data: data }; } catch (err) { console.warn(`加载 ${sym} 动态指标失败`, err); return { symbol: sym, data: { error: err.message } }; } }); const results = await Promise.all(promises); const map = {}; for (const { symbol, data } of results) { map[symbol] = data; } cachedDynamicMap = map; return map; } // 预加载动态指标(静默,不阻塞界面) async function preloadDynamicIndicators() { if (!activeSource || !cachedData) return; if (cachedDynamicMap && Object.keys(cachedDynamicMap).length > 0) return; console.log('[预加载] 开始静默加载动态指标...'); await loadDynamicIndicatorsForAllSymbols(); console.log('[预加载] 动态指标加载完成'); // 如果当前正在显示实时指标标签页,刷新内容 if (currentMode === 'realtime') { renderRealtimeIndicators(); } } // 渲染实时指标到主内容区(支持自动加载) async function renderRealtimeIndicators() { if (!activeSource || !cachedData) { resultDiv.innerHTML = '
⚠️ 请先点击 MEXC 或 Binance 按钮获取K线数据
'; return; } // 如果动态指标尚未加载,显示加载中并触发加载 if (!cachedDynamicMap || Object.keys(cachedDynamicMap).length === 0) { resultDiv.innerHTML = '
⏳ 正在加载实时指标,请稍候...
'; await preloadDynamicIndicators(); // 加载完成后递归调用自身显示内容 await renderRealtimeIndicators(); return; } const dynamicFragment = renderAllDynamicIndicators(cachedDynamicMap); resultDiv.innerHTML = ''; resultDiv.appendChild(dynamicFragment); } async function showParameterList() { resultDiv.innerHTML = '
⏳ 加载参数清单中...
'; try { const params = await loadParameters(); const paramFragment = renderParameterList(params); const container = document.createElement('div'); container.id = 'fullParamContainer'; container.appendChild(paramFragment); resultDiv.innerHTML = ''; resultDiv.appendChild(container); // 静默加载动态指标到缓存(供复制和实时指标标签使用) if (activeSource && cachedData) { await preloadDynamicIndicators(); } } catch (err) { console.error('参数清单加载错误:', err); resultDiv.innerHTML = `
❌ 参数清单加载失败
${err.message}
`; } } function updateView() { if (currentMode === 'full') { if (!cachedData) { resultDiv.innerHTML = '
暂无数据,请点击上方按钮获取数据
'; return; } const node = renderFullData(cachedData); resultDiv.innerHTML = ''; resultDiv.appendChild(node); } else if (currentMode === 'current') { if (!cachedData) { resultDiv.innerHTML = '
暂无数据,请点击上方按钮获取数据
'; return; } const node = renderCurrentData(cachedData); resultDiv.innerHTML = ''; resultDiv.appendChild(node); } else if (currentMode === 'param') { showParameterList(); } else if (currentMode === 'realtime') { renderRealtimeIndicators(); } } function setActiveTab(mode) { if (currentMode === mode) return; currentMode = mode; const tabCurrent = document.getElementById('tabCurrent'); const tabFull = document.getElementById('TabFull'); const paramTab = document.getElementById('paramTab'); const tabRealTime = document.getElementById('tabRealTime'); tabCurrent.classList.remove('active'); tabFull.classList.remove('active'); paramTab.classList.remove('active'); if (tabRealTime) tabRealTime.classList.remove('active'); if (mode === 'current') tabCurrent.classList.add('active'); else if (mode === 'full') tabFull.classList.add('active'); else if (mode === 'param') paramTab.classList.add('active'); else if (mode === 'realtime' && tabRealTime) tabRealTime.classList.add('active'); updateView(); }