fix(editor): 优化提及插入逻辑并修复光标位置问题

重构提及插入逻辑,使用更直接的方式删除@符号到光标间的内容
将普通空格替换为不间断空格以避免被HTML压缩
确保光标始终正确放置在插入内容之后
This commit is contained in:
Phoenix 2025-06-10 11:03:24 +08:00
parent d4e52152ef
commit 8bba2d64af

View File

@ -233,39 +233,38 @@ const insertMention = (member, clonedRange) => {
const parent = textNode.parentNode;
if (!parent) return; // Sanity check
const textBeforeAt = textContent.substring(0, atIndex);
const textAfterCursor = textContent.substring(offset);
// @
range.setStart(textNode, atIndex);
range.setEnd(textNode, offset);
range.deleteContents();
const beforeNode = document.createTextNode(textBeforeAt);
const spaceAfterMentionNode = document.createTextNode(' '); // Ensure space after mention
const afterNode = document.createTextNode(textAfterCursor);
parent.insertBefore(beforeNode, textNode);
parent.insertBefore(mentionSpan, textNode);
parent.insertBefore(spaceAfterMentionNode, textNode);
parent.insertBefore(afterNode, textNode);
parent.removeChild(textNode);
range.setStartAfter(spaceAfterMentionNode);
range.collapse(true);
// mention
range.insertNode(mentionSpan);
} else {
// @
if (!range.collapsed) {
range.deleteContents();
}
range.insertNode(mentionSpan);
}
const spaceNode = document.createTextNode(' ');
// range mentionSpan
const tempRangeForSpace = range.cloneRange(); // 使 range range
tempRangeForSpace.setStartAfter(mentionSpan);
tempRangeForSpace.collapse(true);
tempRangeForSpace.insertNode(spaceNode);
// range
// mention
const spaceNode = document.createTextNode('\u00A0'); // 使
const currentParent = mentionSpan.parentNode;
if (currentParent) {
// mentionSpan
if (mentionSpan.nextSibling) {
currentParent.insertBefore(spaceNode, mentionSpan.nextSibling);
} else {
currentParent.appendChild(spaceNode);
}
//
range.setStartAfter(spaceNode);
range.collapse(true);
} else {
// Fallback: mentionSpan mentionSpan
range.setStartAfter(mentionSpan);
range.collapse(true);
}
selection.removeAllRanges();