From 6764c05c3f1353a357a21a44530b3fb191ca1245 Mon Sep 17 00:00:00 2001 From: zkjqd <1491087953@qq.com> Date: Mon, 30 Mar 2026 11:20:03 +0800 Subject: [PATCH] input-slash-click --- channel/web/static/js/console.js | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/channel/web/static/js/console.js b/channel/web/static/js/console.js index b9786142..8eb5f5c3 100644 --- a/channel/web/static/js/console.js +++ b/channel/web/static/js/console.js @@ -507,21 +507,29 @@ function renderSlashItems() { `${escapeHtml(c.desc)}` ).join(''); - slashMenu.querySelectorAll('.slash-menu-item').forEach(el => { - el.addEventListener('mouseenter', () => { - slashActiveIdx = parseInt(el.dataset.idx); - renderSlashItems(); - }); - el.addEventListener('mousedown', (e) => { - e.preventDefault(); - selectSlashCommand(parseInt(el.dataset.idx)); - }); - }); - const activeEl = slashMenu.querySelector('.slash-menu-item.active'); if (activeEl) activeEl.scrollIntoView({ block: 'nearest' }); } +// Delegated events on the persistent slashMenu container (not destroyed by innerHTML) +slashMenu.addEventListener('mouseover', (e) => { + const item = e.target.closest('.slash-menu-item'); + if (!item) return; + const idx = parseInt(item.dataset.idx); + if (idx === slashActiveIdx) return; + slashActiveIdx = idx; + slashMenu.querySelectorAll('.slash-menu-item').forEach(el => { + el.classList.toggle('active', parseInt(el.dataset.idx) === idx); + }); +}); + +slashMenu.addEventListener('mousedown', (e) => { + const item = e.target.closest('.slash-menu-item'); + if (!item) return; + e.preventDefault(); + selectSlashCommand(parseInt(item.dataset.idx)); +}); + function selectSlashCommand(idx) { if (idx < 0 || idx >= slashFiltered.length) return; const chosen = slashFiltered[idx].cmd;