保留对附加节点的引用javascript

c9x0cxw0  于 2023-01-01  发布在  Java
关注(0)|答案(6)|浏览(104)

请不要去图书馆,我管不了.
我正在添加一个文档片段到dom。这一切工作。没有问题。
追加片段后如何保留/检索节点列表?相关代码:

var frag = document.createDocumentFragment();
//add some content to the fragment
element.appendChild(frag);
    • 同样,这很有效!我不需要关于如何向dom添加内容的故障排除!**

如果设置var e = element.appendChild(frag);,所有内容都会正常追加,但e =一个空文档片段。
我在这里寻找一些平滑的魔法巫毒。不要让我在整个dom上循环。内容可以是任何东西,一个或多个节点,有或没有孩子。如果有一些技巧与querySelectorAll或其他东西,这将是可以接受的。
谢谢!

    • EDIT**进一步查看,上面的e实际上是返回的frag变量的引用,在将其附加到dom后为空。这很像元素被整齐地从片段滑到dom中,片段只是空着。
j91ykkif

j91ykkif1#

和你描述的一模一样当元素被附加到元素后,它们会从片段中移除,以防止延迟引用导致内存泄漏。
获取这些子节点的一种方法是在执行appendChild()之前创建片段的childNodes的浅副本:

// make shallow copy, use Array.prototype to get .slice() goodness
var children = [].slice.call(frag.childNodes, 0);

element.appendChild(frag);

return children;
dohp0rv5

dohp0rv52#

如果您只是在添加后才查看,那么lastChild是最佳选择。

var e = element.lastChild;

更多info in SitePoint

fdbelqdn

fdbelqdn3#

来自DocumentFragment的文档:
各种其他方法可以将文档片段作为参数(例如,诸如appendChild和insertBefore之类的任何节点接口方法),在这种情况下,追加或插入片段的子节点,而不是片段本身。
因此appendChild方法返回documentFragment,但它是空的,因为它的子节点插入到element对象中,并且(来自appendChild doc):
[...]一个节点不可能同时出现在文档的两个点上,所以如果这个节点已经有了父节点,那么它首先会被移除,然后被添加到新的位置上。
现在...您可以在缓存数组中存储您的子项,并在返回后将其返回(或参见Jack解决方案:-))

fdx2calv

fdx2calv4#

类似于Jack的解决方案,但如果使用esnext,则可以将Array.from用作

const children = Array.from(frag.children);

element.appendChild(frag);

return children;
s4chpxco

s4chpxco5#

如果你的文档片段中只有一个主元素,你可以使用.firstElementChild,仅此而已。如果要复制多个副本,请使用.cloneNode(true)。示例-https://codepen.io/SergeiMinaev/pen/abLzQjZ

uemypmqf

uemypmqf6#

多亏了@The Sloth的评论,我找到了这个解决方案,终于帮我解决了:
第一个月
在我的例子中,element.lastChild返回一个文本节点,而不是附加的节点。

相关问题