fix: 用 loading class 精确定位placeholder,修复RAG下loading不消失

上次用 :last-of-type 修复无效(:last-of-type 也是按元素类型div匹配,
系统消息也是div,一样命中不了placeholder)。

改用给 placeholder 加 .loading class 的方案:
- appendAssistantPlaceholder 添加 .loading class
- updateLastAssistantMessage 用 .message.assistant.loading 选择器
- 成功/失败后移除 .loading class

选择器不再依赖 DOM 位置,彻底不受 appendSystemMessage 影响。
This commit is contained in:
Metona
2026-04-05 00:29:08 +08:00
parent f3589ae057
commit 86a2797d44
2 changed files with 7 additions and 4 deletions
+3 -2
View File
@@ -221,9 +221,10 @@ export function appendMessageDOM(msg, index) {
/** 更新最后一条 assistant 消息(流式输出) */ /** 更新最后一条 assistant 消息(流式输出) */
export function updateLastAssistantMessage(content, think, stats, model) { export function updateLastAssistantMessage(content, think, stats, model) {
const lastMsg = messagesContainerEl.querySelector('.message.assistant:last-of-type'); const lastMsg = messagesContainerEl.querySelector('.message.assistant.loading');
if (!lastMsg) return; if (!lastMsg) return;
lastMsg.classList.remove('loading');
const loadingDots = lastMsg.querySelector('.loading-dots'); const loadingDots = lastMsg.querySelector('.loading-dots');
const loadingText = lastMsg.querySelector('.loading-text'); const loadingText = lastMsg.querySelector('.loading-text');
if (loadingDots) loadingDots.remove(); if (loadingDots) loadingDots.remove();
@@ -284,7 +285,7 @@ export function updateLastAssistantMessage(content, think, stats, model) {
/** 追加临时的 assistant 消息占位 */ /** 追加临时的 assistant 消息占位 */
export function appendAssistantPlaceholder() { export function appendAssistantPlaceholder() {
const div = document.createElement('div'); const div = document.createElement('div');
div.className = 'message assistant'; div.className = 'message assistant loading';
div.innerHTML = ` div.innerHTML = `
<div class="msg-avatar">🤖</div> <div class="msg-avatar">🤖</div>
<div class="msg-body"> <div class="msg-body">
+4 -2
View File
@@ -511,11 +511,12 @@ ${ragContext}
console.error('[InputArea] 流式聊天错误:', err); console.error('[InputArea] 流式聊天错误:', err);
if (err.name === 'AbortError') { if (err.name === 'AbortError') {
const placeholder = document.querySelector('#messagesContainer .message.assistant:last-of-type'); const placeholder = document.querySelector('#messagesContainer .message.assistant.loading');
const loadingDots = placeholder?.querySelector('.loading-dots'); const loadingDots = placeholder?.querySelector('.loading-dots');
const loadingText = placeholder?.querySelector('.loading-text'); const loadingText = placeholder?.querySelector('.loading-text');
if (loadingDots) loadingDots.remove(); if (loadingDots) loadingDots.remove();
if (loadingText) loadingText.remove(); if (loadingText) loadingText.remove();
placeholder?.classList.remove('loading');
const contentDiv = placeholder?.querySelector('.msg-content'); const contentDiv = placeholder?.querySelector('.msg-content');
@@ -547,11 +548,12 @@ ${ragContext}
return; return;
} }
const placeholder = document.querySelector('#messagesContainer .message.assistant:last-of-type'); const placeholder = document.querySelector('#messagesContainer .message.assistant.loading');
const loadingDots = placeholder?.querySelector('.loading-dots'); const loadingDots = placeholder?.querySelector('.loading-dots');
const loadingText = placeholder?.querySelector('.loading-text'); const loadingText = placeholder?.querySelector('.loading-text');
if (loadingDots) loadingDots.remove(); if (loadingDots) loadingDots.remove();
if (loadingText) loadingText.remove(); if (loadingText) loadingText.remove();
placeholder?.classList.remove('loading');
const contentDiv = placeholder?.querySelector('.msg-content'); const contentDiv = placeholder?.querySelector('.msg-content');