[英]retain reference to appended node javascript
请不要图书馆。 超出我的控制。
我正在将文档片段附加到 dom。 这一切都有效。 没问题。
附加片段后如何保留/检索节点列表? 相关代码:
var frag = document.createDocumentFragment();
//add some content to the fragment
element.appendChild(frag);
再次,这有效! 我不需要解决如何向 dom 添加内容的问题!
如果我设置var e = element.appendChild(frag);
,一切都会正常附加,但e
= 空文档片段。
我在这里寻找一些光滑的魔术巫毒。 不要让我遍历整个 dom。 内容可以是任何东西,一个或多个有或没有孩子的节点。 如果 querySelectorAll 有一些技巧或可以接受的东西。
谢谢!
编辑进一步戳,似乎上面的e
实际上是对frag
var 的返回引用,在将它附加到 dom 之后它是空的。 这很像元素从片段中整齐地滑入 dom,而片段只是空着。
这正是你所描述的; 当元素附加到元素时,它们将从片段中删除,以防止延迟引用导致内存泄漏。
获取这些子节点的一种方法是在执行appendChild()
之前制作片段的childNodes
的浅表副本:
// make shallow copy, use Array.prototype to get .slice() goodness
var children = [].slice.call(frag.childNodes, 0);
element.appendChild(frag);
return children;
各种其他方法可以将文档片段作为参数(例如,任何Node接口方法,例如appendChild和insertBefore),在这种情况下,片段的子节点被附加或插入,而不是片段本身。
所以appendChild
方法返回documentFragment但它是空的,因为它的子节点插入到你的element
对象中(来自appendChild doc):
[...]节点不能同时位于文档的两个点。 因此,如果节点已经有父节点,则首先将其删除,然后附加到新位置。
现在......您可以将孩子存储在缓存数组中并在返回后(或参见Jack解决方案:-))
就像杰克的解决方案一样,但如果您使用的是esnext,则可以使用Array.from
const children = Array.from(frag.children);
element.appendChild(frag);
return children;
如果您的文档片段中有单个主要元素,则可以使用.firstElementChild
,仅此.firstElementChild
。 要制作多个副本,请使用.cloneNode(true)
。 示例 - https://codepen.io/SergeiMinaev/pen/abLzQjZ
感谢@The Sloth 的评论,我找到了这个解决方案,最终为我解决了这个问题:
var node = element.lastElementChild
在我的例子中, element.lastChild
返回了一个文本节点而不是附加的节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.