fix: 停止时消息内容显示 undefined — 彻底修复

根本原因:catch 块从 DOM 读 textContent 存在时序问题,改为直接用
assistantContent 变量(已在 try 外声明),完全绕过 DOM 读取。

改动:
- catch 块:不再读 contentDiv.textContent,直接用 assistantContent
- appendMessageDOM:空内容不调 safeMarkdown 避免生成空 <p>
- 通用错误处理同样改用 assistantContent
This commit is contained in:
thzxx
2026-04-03 12:46:30 +08:00
parent eb04a6baa8
commit 17a818c3da
2 changed files with 20 additions and 13 deletions
+4
View File
@@ -86,7 +86,11 @@ export function appendMessageDOM(msg, index) {
</div> </div>
</div>`; </div>`;
} }
if (safeContent) {
contentHtml += `<div class="msg-content">${safeMarkdown(safeContent)}</div>`; contentHtml += `<div class="msg-content">${safeMarkdown(safeContent)}</div>`;
} else {
contentHtml += `<div class="msg-content"></div>`;
}
} else { } else {
contentHtml += `<div class="msg-content">${escapeHtml(safeContent)}</div>`; contentHtml += `<div class="msg-content">${escapeHtml(safeContent)}</div>`;
} }
+15 -12
View File
@@ -264,13 +264,12 @@ export async function sendMessage() {
if (loadingDots) loadingDots.remove(); if (loadingDots) loadingDots.remove();
if (loadingText) loadingText.remove(); if (loadingText) loadingText.remove();
// 获取已有的流式内容
const contentDiv = placeholder?.querySelector('.msg-content'); const contentDiv = placeholder?.querySelector('.msg-content');
const existingContent = contentDiv?.textContent || '';
// 保存部分消息(直接用 assistantContent,不从 DOM 读)
const partialMsg = { const partialMsg = {
role: 'assistant', role: 'assistant',
content: existingContent || '', content: assistantContent,
timestamp: Date.now(), timestamp: Date.now(),
...(modelName && { model: modelName }), ...(modelName && { model: modelName }),
...(thinkContent && { think: thinkContent }), ...(thinkContent && { think: thinkContent }),
@@ -278,10 +277,14 @@ export async function sendMessage() {
}; };
currentSession.messages.push(partialMsg); currentSession.messages.push(partialMsg);
if (contentDiv && existingContent) { // 更新 DOM
contentDiv.innerHTML = safeMarkdown(existingContent) + '<p><code>[已停止]</code></p>'; if (contentDiv) {
} else { let html = '';
if (contentDiv) contentDiv.innerHTML = '<p><code>[已停止]</code></p>'; if (assistantContent) {
html = safeMarkdown(assistantContent);
}
html += '<p><code>[已停止]</code></p>';
contentDiv.innerHTML = html;
} }
appendSystemMessage('⏹ 已停止生成'); appendSystemMessage('⏹ 已停止生成');
@@ -293,23 +296,23 @@ export async function sendMessage() {
return; return;
} }
// 其他错误
const placeholder = document.querySelector('#messagesContainer .message.assistant:last-child'); const placeholder = document.querySelector('#messagesContainer .message.assistant:last-child');
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();
const existingContent = placeholder?.querySelector('.msg-content')?.textContent || ''; const contentDiv = placeholder?.querySelector('.msg-content');
if (existingContent) { if (assistantContent && contentDiv) {
const partialMsg = { const partialMsg = {
role: 'assistant', role: 'assistant',
content: existingContent + '\n\n`[已中断]`', content: assistantContent + '\n\n`[已中断]`',
timestamp: Date.now(), timestamp: Date.now(),
}; };
currentSession.messages.push(partialMsg); currentSession.messages.push(partialMsg);
const contentDiv = placeholder?.querySelector('.msg-content'); contentDiv.innerHTML = safeMarkdown(assistantContent) + '<p><code>[已中断]</code></p>';
if (contentDiv) contentDiv.innerHTML = `<p>${existingContent}</p><p><code>[已中断]</code></p>`;
await saveCurrentSession(); await saveCurrentSession();
} else { } else {
if (placeholder) placeholder.remove(); if (placeholder) placeholder.remove();