There is wrong wtih replaceElement(elem: Node, replacement: Node): void
lamianbu opened this issue · 1 comments
lamianbu commented
export function replaceElement(elem: Node, replacement: Node): void {
const prev = (replacement.prev = elem.prev);
if (prev) {
prev.next = replacement;
}
const next = (replacement.next = elem.next);
if (next) {
next.prev = replacement;
}
const parent = (replacement.parent = elem.parent);
if (parent) {
const childs = parent.children;
childs[childs.lastIndexOf(elem)] = replacement;
}
}
forgetting to write elem.parent = null
it is very importfant!
if next step is appendChild's innner removeElement
export function removeElement(elem: Node): void {
if (elem.prev) elem.prev.next = elem.next;
if (elem.next) elem.next.prev = elem.prev;
if (elem.parent) {
const childs = elem.parent.children;
childs.splice(childs.lastIndexOf(elem), 1);
}
}
childs.lastIndexOf(elem) is -1, it will delete some element else
lamianbu commented
the case is:(want to wrap elem with <template>
)
const handler: DomHandler = new DomHandler(null, null, (newTemplate: Element) => {
replaceElementMy(elem as unknown as Node, newTemplate);
appendChildMy(newTemplate, elem as unknown as Node);
template = newTemplate as unknown as HTMLTemplateElement;
});
new Parser(handler).end('<template></template>');
there is something wrong.