align id map by skip extra added nodes

This commit is contained in:
Yanzhen Yu
2026-04-01 12:00:00 +08:00
parent c9bb0e6557
commit e040ae76c5
3 changed files with 41 additions and 5 deletions

View File

@@ -39,7 +39,10 @@ function record(options: recordOptions = {}) {
emit(
wrapEvent({
type: EventType.Load,
data: { width: getWindowWidth(), height: getWindowHeight() },
data: {
width: getWindowWidth(),
height: getWindowHeight(),
},
}),
);
const [node, idNodeMap] = snapshot(document);
@@ -47,7 +50,18 @@ function record(options: recordOptions = {}) {
return console.warn('Failed to snapshot the document');
}
mirror.map = idNodeMap;
emit(wrapEvent({ type: EventType.FullSnapshot, data: { node } }));
emit(
wrapEvent({
type: EventType.FullSnapshot,
data: {
node,
initialOffset: {
left: document.documentElement.scrollLeft,
top: document.documentElement.scrollTop,
},
},
}),
);
initObservers({
mutationCb: m =>
emit(

View File

@@ -26,6 +26,10 @@ export type fullSnapshotEvent = {
type: EventType.FullSnapshot;
data: {
node: serializedNodeWithId;
initialOffset: {
top: number;
left: number;
};
};
};
@@ -199,3 +203,7 @@ export type throttleOptions = {
export type listenerHandler = () => void;
export type hookResetter = () => void;
export type playerConfig = {
speed: number;
};

View File

@@ -40,9 +40,20 @@ export function getIdNodeMap(doc: Document) {
return null;
}
if (node.type === NodeType.Document || node.type === NodeType.Element) {
for (const _n of Array.from(n.childNodes)) {
walk(_n);
let dataStr: string | null = null;
let extraChildIndexes: number[] = [];
if (node.type === NodeType.Element) {
dataStr = (n as Element).getAttribute('data-extra-child-index');
}
if (dataStr) {
extraChildIndexes = JSON.parse(dataStr);
}
n.childNodes.forEach((childNode, index) => {
// skip extra DOM created when rebuild
if (extraChildIndexes.indexOf(index) < 0) {
walk(childNode);
}
});
}
}
@@ -92,7 +103,10 @@ export function hookSetter<T>(
const original = Object.getOwnPropertyDescriptor(target, key);
Object.defineProperty(target, key, {
set(value) {
d.set!.call(this, value);
// put hooked setter into event loop to avoid of set latency
setTimeout(() => {
d.set!.call(this, value);
}, 0);
if (original && original.set) {
original.set.call(this, value);
}