请不要去图书馆,我管不了.
我正在添加一个文档片段到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中,片段只是空着。
- EDIT**进一步查看,上面的
6条答案
按热度按时间j91ykkif1#
和你描述的一模一样当元素被附加到元素后,它们会从片段中移除,以防止延迟引用导致内存泄漏。
获取这些子节点的一种方法是在执行
appendChild()
之前创建片段的childNodes
的浅副本:dohp0rv52#
如果您只是在添加后才查看,那么
lastChild
是最佳选择。更多info in SitePoint
fdbelqdn3#
来自DocumentFragment的文档:
各种其他方法可以将文档片段作为参数(例如,诸如appendChild和insertBefore之类的任何节点接口方法),在这种情况下,追加或插入片段的子节点,而不是片段本身。
因此
appendChild
方法返回documentFragment,但它是空的,因为它的子节点插入到element
对象中,并且(来自appendChild doc):[...]一个节点不可能同时出现在文档的两个点上,所以如果这个节点已经有了父节点,那么它首先会被移除,然后被添加到新的位置上。
现在...您可以在缓存数组中存储您的子项,并在返回后将其返回(或参见Jack解决方案:-))
fdx2calv4#
类似于Jack的解决方案,但如果使用esnext,则可以将
Array.from
用作s4chpxco5#
如果你的文档片段中只有一个主元素,你可以使用
.firstElementChild
,仅此而已。如果要复制多个副本,请使用.cloneNode(true)
。示例-https://codepen.io/SergeiMinaev/pen/abLzQjZuemypmqf6#
多亏了@The Sloth的评论,我找到了这个解决方案,终于帮我解决了:
第一个月
在我的例子中,
element.lastChild
返回一个文本节点,而不是附加的节点。