From e9f3a6c8a6a8f663105ce68b54821ddf6fcf88de Mon Sep 17 00:00:00 2001 From: nevermoregb Date: Mon, 31 Mar 2025 20:24:03 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=9B=90=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/board/BoardEdit.vue | 45 ++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/src/views/board/BoardEdit.vue b/src/views/board/BoardEdit.vue index 785e781..cb552f1 100644 --- a/src/views/board/BoardEdit.vue +++ b/src/views/board/BoardEdit.vue @@ -141,13 +141,34 @@ } }; - function extractPlainText(delta) { - if (!delta || !Array.isArray(delta.ops)) return ''; - return delta.ops - .filter(op => typeof op.insert === 'string') - .map(op => op.insert.trim()) - .join(' ') - .trim(); + function isDeltaChanged(current, original) { + const Delta = Quill.import('delta'); + const currentDelta = new Delta(current || []); + const originalDelta = new Delta(original || []); + + const diff = originalDelta.diff(currentDelta); + if (!diff || diff.ops.length === 0) return false; + + // 텍스트만 비교해서 완전 동일한지 확인 + const getPlainText = delta => + (delta.ops || []) + .filter(op => typeof op.insert === 'string') + .map(op => op.insert) + .join(''); + + const getImages = delta => + (delta.ops || []).filter(op => typeof op.insert === 'object' && op.insert.image).map(op => op.insert.image); + + const textCurrent = getPlainText(currentDelta); + const textOriginal = getPlainText(originalDelta); + + const imgsCurrent = getImages(currentDelta); + const imgsOriginal = getImages(originalDelta); + + const textEqual = textCurrent === textOriginal; + const imageEqual = JSON.stringify(imgsCurrent) === JSON.stringify(imgsOriginal); + + return !(textEqual && imageEqual); // 둘 다 같아야 false } const isChanged = computed(() => { @@ -212,16 +233,6 @@ contentLoaded.value = true; }; - watch( - content, - val => { - if (contentLoaded.value && !originalPlainText.value) { - originalPlainText.value = extractPlainText(val); - } - }, - { immediate: true }, - ); - const handleUpdateEditorImg = item => { editorUploadedImgList.value = item; };