// ==================== 数据加载函数 ====================
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();
}