From 1902949f69107212138f754663e92668704cdc82 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 30 Oct 2026 12:56:26 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=89=8B=E6=9C=BA=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=A0=8F=E6=8C=89=E9=92=AE=E5=9C=A8=E5=A4=B1=E7=84=A6?= =?UTF-8?q?=E9=87=8D=E6=8E=92=E6=97=B6=E4=B8=A2=E5=A4=B1=E7=82=B9=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/js/chat.js | 8 +++++--- tests/frontend/chat.test.cjs | 13 +++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/static/js/chat.js b/static/js/chat.js index 57295cf..8ef48a9 100644 --- a/static/js/chat.js +++ b/static/js/chat.js @@ -1842,9 +1842,11 @@ if(window.visualViewport){ window.addEventListener('pageshow', scheduleChatViewport); inputDom.addEventListener('focus', scheduleChatViewport); inputDom.addEventListener('blur', scheduleChatViewport); -// Keep an already open keyboard while tapping Send; keyboard navigation is unchanged. -sendBtn.addEventListener('pointerdown', function(event){ - if(event.button === 0 && document.activeElement === inputDom) event.preventDefault(); +// Let toolbar clicks complete before blur changes the keyboard and composer layout. +document.querySelector('.composer').addEventListener('pointerdown', function(event){ + if(event.button === 0 && document.activeElement === inputDom && event.target.closest('button')){ + event.preventDefault(); + } }); syncChatViewport(); diff --git a/tests/frontend/chat.test.cjs b/tests/frontend/chat.test.cjs index cc49c0b..ef58c0c 100644 --- a/tests/frontend/chat.test.cjs +++ b/tests/frontend/chat.test.cjs @@ -711,15 +711,20 @@ test('late AI completion does not steal focus or reopen a dismissed mobile keybo } }); -test('mobile quick questions do not summon the keyboard and tapping Send retains an active draft focus', async () => { +test('mobile quick questions keep the keyboard closed and composer controls finish clicking before blur changes layout', async () => { const app=await customerPage({human:false,width:390}); const input=app.element('input-text'); await app.context.window.fillInput('快捷咨询');await flush(); assert.equal(input.focusCalls.length,0); input.focus(); - let prevented=false; - app.element('send-button').listeners.pointerdown({button:0,preventDefault(){prevented=true;}}); - assert.ok(prevented); + for(const name of ['send-button','voice-toggle','emoji-toggle','upload-btn']){ + let prevented=false; + app.element('.composer').listeners.pointerdown({button:0,target:{closest:()=>app.element(name)},preventDefault(){prevented=true;}}); + assert.ok(prevented); + } + let blockedTextSelection=false; + app.element('.composer').listeners.pointerdown({button:0,target:{closest:()=>null},preventDefault(){blockedTextSelection=true;}}); + assert.equal(blockedTextSelection,false); assert.equal(app.context.document.activeElement,input); });