fb55/domutils

There is wrong wtih replaceElement(elem: Node, replacement: Node): void

lamianbu opened this issue · 1 comments

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

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.