使用javascript区分html节点列表

ubof19bj  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(133)
const array = [
    {
        id: 1,
        text: "DOREAMON"
    },
    {
        id: 2,
        text: "NOBITA"
    },
    {
        id: 3,
        text: "SIZUKA"
    },
    {
        id: 4,
        text: "GIYAN"
    },
    {
        id: 5,
        text: "SUNIYO"
    },
    {
        id: 6,
        text: "DEKISUGI"
    },
];

const app = document.querySelector("#user-list");
const textNode= document.createTextNode("");
app.append(textNode);

let lookup = new Map();
const insertList = () => {
    const source = /** SOURCE */ array;
    const set = new Set();
    const newLookup = new Map();
    let anchor = textNode;

    for(const index in source) {
        const key = /** KEY */ source[index].id;
        if (set.has(key)) {
            console.log("KEY IS ALREADY EXIST:", key);
        } else set.add(key);
    
        let child = lookup.get(key);
        /**
         * TODO:
         * Need to append IF
         *    if child is null/undefined
         *    OR ( anchor != textNode AND anchor.nextSibling != child)
         */
        if (!child) {
            child = document.createElement("div");
            child.textContent = source[index].text;
        }
    
        lookup.delete(key);
        newLookup.set(key, child);
    
        // TODO: Do I need it to append or it is already at the right place
        app.insertBefore(child, anchor.nextSibling);
        anchor = child;
    }

    for(const el of lookup.values()) {
        app.removeChild(el);
    }

    lookup = newLookup;
}

如果我运行insertList函数,那么它会创建元素并追加到#user-list元素。工作正常。但当我从数组中删除第一个元素时,再次运行insertList函数。它会再次追加#user-list中的每个子元素,但它应该只从dom中删除第一个节点,而不需要再次追加元素。
我尝试了nextSibling()previousSibling()来检查当前子节点是否是上一个子节点的相邻节点,那么我就不需要追加。但是这次nextSibling()previousSibling()都不起作用。

wwtsj6pe

wwtsj6pe1#

NodeList和HTML集合在很大程度上是一回事。
两者都是从文档中提取的节点(元素)的类似数组的集合(列表)。节点可以通过索引号访问。索引从0开始。
两者都有传回清单(集合)中项目数目的length属性。
HTMLCollection是文档元素的集合。
NodeList是文档节点(元素节点、属性节点和文本节点)的集合。
HTMLCollection项目可以通过其名称、ID或索引号进行访问。
NodeList项只能通过其索引号进行访问。
HTMLCollection始终是活动集合。例如:如果您将

  • 元素添加到DOM中的列表时,HTMLCollection中的列表也将更改。

NodeList通常是静态集合。例如:如果您将

  • 元素添加到DOM中的列表,则NodeList中的列表不会更改。

getElementsByClassName()和getElementsByTagName()方法会传回即时的HTML集合。
querySelectorAll()方法会传回静态NodeList。
childNodes属性会传回即时的NodeList。

相关问题