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( emit(
wrapEvent({ wrapEvent({
type: EventType.Load, type: EventType.Load,
data: { width: getWindowWidth(), height: getWindowHeight() }, data: {
width: getWindowWidth(),
height: getWindowHeight(),
},
}), }),
); );
const [node, idNodeMap] = snapshot(document); const [node, idNodeMap] = snapshot(document);
@@ -47,7 +50,18 @@ function record(options: recordOptions = {}) {
return console.warn('Failed to snapshot the document'); return console.warn('Failed to snapshot the document');
} }
mirror.map = idNodeMap; 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({ initObservers({
mutationCb: m => mutationCb: m =>
emit( emit(

View File

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

View File

@@ -40,9 +40,20 @@ export function getIdNodeMap(doc: Document) {
return null; return null;
} }
if (node.type === NodeType.Document || node.type === NodeType.Element) { if (node.type === NodeType.Document || node.type === NodeType.Element) {
for (const _n of Array.from(n.childNodes)) { let dataStr: string | null = null;
walk(_n); 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); const original = Object.getOwnPropertyDescriptor(target, key);
Object.defineProperty(target, key, { Object.defineProperty(target, key, {
set(value) { 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) { if (original && original.set) {
original.set.call(this, value); original.set.call(this, value);
} }