我一直在考虑在 Backbone.js 应用程序中使用 documentFragments,并且想知道为什么我看到在将 documentFragment 附加到父 DOM 元素时使用“cloneNode”的示例。
可以看一个例子here。如果您查看 DocumentFragment 部分,您会看到以下内容:
oFrag = document.createDocumentFragment();
for (var i = 0, imax = aElms.length; i < imax; i++) {
oFrag.appendChild(aElms[i]);
}
o.innerHTML = '';
o.appendChild(oFrag.cloneNode(true));
为什么“oFrag”被克隆而不是仅仅附加它?其他博客文章不使用“cloneNode”(作为比较)。
Your 第一个链接指的是博客文章作者使用的地方document.getElementsByTagName
代替document.getElementById
,就像测试用例中一样。如果你想要多个元素(即:div)被赋予相同的documentFragment
,您必须克隆它:
如果 child 是对文档中现有节点的引用,appendChild 会将其从当前位置移动到新位置(即,在将节点附加到其他节点之前不需要从其父节点中删除该节点)。
这也意味着一个节点不能同时位于文档的两个点中。因此,如果该节点已经有父节点,则首先将其删除,然后将其追加到新位置。
via MDN
最有可能的是作者(或其他人)复制粘贴了代码而没有考虑到这一点。自己尝试一下 - 你可以使用appendChild
没有cloneNode
一切正常。
另一种可能性是,在 jsperf 上创建此测试用例的人并没有了解准备代码的工作原理,并且担心第一个测试会为空aElms
数组,它将不再起作用。In fact准备代码在每次定时迭代之前执行,因此无需担心其内容。
最后一件事可能是性能问题。如果你真的想测试真实插入,您需要克隆该节点。否则,你将测试树重新附着相反(请参阅上面的 MDN 链接)。
另请注意克隆会破坏事件侦听器.
快乐碎片! ;)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)