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()
都不起作用。
1条答案
按热度按时间wwtsj6pe1#
NodeList和HTML集合在很大程度上是一回事。
两者都是从文档中提取的节点(元素)的类似数组的集合(列表)。节点可以通过索引号访问。索引从0开始。
两者都有传回清单(集合)中项目数目的length属性。
HTMLCollection是文档元素的集合。
NodeList是文档节点(元素节点、属性节点和文本节点)的集合。
HTMLCollection项目可以通过其名称、ID或索引号进行访问。
NodeList项只能通过其索引号进行访问。
HTMLCollection始终是活动集合。例如:如果您将
NodeList通常是静态集合。例如:如果您将
getElementsByClassName()和getElementsByTagName()方法会传回即时的HTML集合。
querySelectorAll()方法会传回静态NodeList。
childNodes属性会传回即时的NodeList。