From 56aca3c2b74f259d507ea19660fdcd5a6f093f35 Mon Sep 17 00:00:00 2001 From: Yanzhen Yu Date: Wed, 1 Apr 2026 12:00:00 +0800 Subject: [PATCH] check is dropped and is removed by ancestors instead of only check parent --- src/record/observer.ts | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/record/observer.ts b/src/record/observer.ts index cf1569b1..2bbee1e7 100644 --- a/src/record/observer.ts +++ b/src/record/observer.ts @@ -131,13 +131,31 @@ function initMutationObserver(cb: mutationCallBack): MutationObserver { return remove; }); + const isDropped = (n: Node): boolean => { + const { parentNode } = n; + if (!parentNode) { + return false; + } + if (dropped.some(d => d === parentNode)) { + return true; + } + return isDropped(parentNode); + }; + + const isRemoved = (n: Node): boolean => { + const { parentNode } = n; + if (!parentNode) { + return false; + } + const parentId = mirror.getId((parentNode as Node) as INode); + if (removes.some(r => r.id === parentId)) { + return true; + } + return isRemoved(parentNode); + }; + Array.from(addsSet).forEach(n => { - const parentId = mirror.getId((n.parentNode as Node) as INode); - if ( - parentId && - !dropped.some(d => d === n.parentNode) && - !removes.some(r => r.id === parentId) - ) { + if (!isDropped(n) && !isRemoved(n)) { adds.push({ parentId: mirror.getId((n.parentNode as Node) as INode), previousId: !n.previousSibling