diff --git a/src/components/editor/CustomEditor.vue b/src/components/editor/CustomEditor.vue
index 03619ff..5dcd1ad 100644
--- a/src/components/editor/CustomEditor.vue
+++ b/src/components/editor/CustomEditor.vue
@@ -96,61 +96,68 @@ const toolbarConfig = computed(() => {
const handleInput = (event) => {
- const target = event.target
-
-
- const editorClone = target.cloneNode(true)
- const quoteElements = editorClone.querySelectorAll('.editor-quote')
- quoteElements.forEach(quote => quote.remove())
- quoteElements.forEach(quote => quote.remove())
-
-
- const emojiImages = editorClone.querySelectorAll('img.editor-emoji')
- let textContent = editorClone.textContent || ''
-
-
+ const editorNode = (event && event.target) ? event.target : editorRef.value;
+ if (!editorNode) {
+ // console.warn('handleInput called without a valid editor node.');
+ return;
+ }
+ const target = editorNode; // Keep target for existing logic if it's deeply coupled, or refactor to use editorNode directly
+
+ const editorClone = editorNode.cloneNode(true);
+ // 优化:移除引用元素,只执行一次
+ editorClone.querySelectorAll('.editor-quote').forEach(quote => quote.remove());
+
+ // 提取文本内容,包括表情的alt文本
+ // 注意:原逻辑中 textContent += altText 可能导致重复,因为 editorClone.textContent 可能已包含表情图片的文本(如果浏览器这样处理)
+ // 一个更可靠的方法是遍历子节点,或者在移除表情图片后再获取textContent
+ let rawTextContent = editorClone.textContent || '';
+ const emojiImages = editorClone.querySelectorAll('img.editor-emoji');
+ // 暂时保留原提取方式,但标记为待优化
+ // TODO: 优化 editorContent.value 的准确性,避免重复计算表情文本
if (emojiImages.length > 0) {
emojiImages.forEach(emoji => {
- const altText = emoji.getAttribute('alt')
+ const altText = emoji.getAttribute('alt');
if (altText) {
- textContent += altText
+ // 这里的拼接逻辑可能不完全准确,取决于textContent如何处理img的alt
+ rawTextContent += altText;
}
- })
+ });
}
-
-
- editorContent.value = textContent
+ editorContent.value = rawTextContent;
-
-
- const editorNode = target;
- const currentNormalizedHtml = editorNode.innerHTML.trim().toLowerCase().replace(/\s+/g, '');
-
- const hasTextContent = editorNode.textContent.trim() !== '';
+ // const editorNode = target; // Already defined as editorNode
+ const currentText = editorNode.textContent.trim();
const hasSpecialElements = editorNode.querySelector('img, .editor-file, .mention');
- if (!hasTextContent && !hasSpecialElements) {
- if (currentNormalizedHtml !== '' && currentNormalizedHtml !== '
') {
- editorNode.innerHTML = '';
+ // 优化:清空编辑器内容的逻辑
+ // 如果编辑器内没有可见的文本内容,也没有图片、文件、提及等特殊元素,则尝试清空。
+ if (currentText === '' && !hasSpecialElements) {
+ // If the editor is visually empty (no text, no special elements),
+ // ensure its innerHTML is cleared to allow the placeholder to show.
+ // This handles cases where the browser might leave a
tag or other empty structures like