From 8c752ec67685bdcb9b0ffc1ed5ef5fb71af138aa Mon Sep 17 00:00:00 2001 From: Codebuddy Date: Fri, 21 Aug 2026 20:40:25 +0800 Subject: [PATCH] =?utf8?q?fix(ui):=20=E6=A8=A1=E5=9E=8B=E4=B8=8B=E6=8B=89?= =?utf8?q?=E5=88=87=E6=8D=A2=E6=97=A0=E6=95=88=E4=BF=AE=E5=A4=8D=20+=20?= =?utf8?q?=E7=82=B9=E5=BC=80=E4=B8=8B=E6=8B=89=E5=AE=9E=E6=97=B6=E5=88=B7?= =?utf8?q?=E6=96=B0=E6=A8=A1=E5=9E=8B=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - change 监听器从 showTerminalMode() 内移至脚本初始化区,全局只绑定一次, 避免重复进入终端页导致重复绑定/未绑定,菜单点了没反应 - 新增 focus/mousedown 触发 loadModelSelect(),每次点开下拉实时拉取最新模型列表 --- frontend/index.html | 63 ++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 7e9d2a1..86806b9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -808,39 +808,43 @@ body { position: fixed; top: 0; left: 0; right: 0; bottom: 0; width: 100%; heigh } // 切换模型:保存到任务,并重启会话以应用 + // 注意:监听器在脚本加载时只绑定一次(见下方初始化区),不放在 showTerminalMode 内, + // 避免重复进入终端页导致重复绑定 / 未绑定,从而引起“点了没反应”。 let modelSwitching = false; - modelSelect.addEventListener('change', async () => { + function onModelChange() { if (modelSwitching || !currentTask) return; const newModel = modelSelect.value; modelSwitching = true; modelSelect.disabled = true; - try { - const res = await fetch(API + '/api/tasks/' + currentTask.id + '/model', { - method: 'POST', - headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders()), - body: JSON.stringify({ model: newModel }) - }); - if (!res.ok) { - const d = await res.json().catch(()=>({})); - alert(d.error || '设置模型失败'); + (async () => { + try { + const res = await fetch(API + '/api/tasks/' + currentTask.id + '/model', { + method: 'POST', + headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders()), + body: JSON.stringify({ model: newModel }) + }); + if (!res.ok) { + const d = await res.json().catch(()=>({})); + alert(d.error || '设置模型失败'); + modelSelect.value = (currentTask.model) || ''; + return; + } + const data = await res.json(); + currentTask.model = (data.task && data.task.model) || ''; + term.writeln('\x1b[33m⏳ 切换模型为 "' + (currentTask.model || '默认·最新GLM') + '",正在重启会话...\x1b[0m'); + // 重启以应用新模型(resume 同样会采用新 --model) + killCurrent(); + if (term) term.clear(); + connectWS(); + } catch (e) { + alert('设置模型失败: ' + e.message); modelSelect.value = (currentTask.model) || ''; - return; + } finally { + modelSwitching = false; + modelSelect.disabled = false; } - const data = await res.json(); - currentTask.model = (data.task && data.task.model) || ''; - term.writeln('\x1b[33m⏳ 切换模型为 "' + (currentTask.model || '默认·最新GLM') + '",正在重启会话...\x1b[0m'); - // 重启以应用新模型(resume 同样会采用新 --model) - killCurrent(); - if (term) term.clear(); - connectWS(); - } catch (e) { - alert('设置模型失败: ' + e.message); - modelSelect.value = (currentTask.model) || ''; - } finally { - modelSwitching = false; - modelSelect.disabled = false; - } - }); + })(); + } // ========== 终端输入辅助 ========== function sendInput(text) { @@ -1677,6 +1681,13 @@ body { position: fixed; top: 0; left: 0; right: 0; bottom: 0; width: 100%; heigh term.writeln('\x1b[33m⏳ 重启会话中...\x1b[0m'); connectWS(); }; + + // 模型下拉:全局只绑定一次 + // - change:切换模型并重启会话 + // - focus / mousedown:点开下拉时实时刷新模型列表(B 方案,所见即最新) + modelSelect.addEventListener('change', onModelChange); + modelSelect.addEventListener('focus', () => { loadModelSelect(); }); + modelSelect.addEventListener('mousedown', () => { loadModelSelect(); }); document.getElementById('btn-list').onclick = () => { window.open('/', 'cb_picker'); }; document.getElementById('btn-close').onclick = () => { killCurrent(); -- 2.43.0