为什么追加documentFragment时需要使用cloneNode?

2023-11-24

我一直在考虑在 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(使用前将#替换为@)

为什么追加documentFragment时需要使用cloneNode? 的相关文章

随机推荐

  • 如何从 .cab 文件安装 mscomct2.ocx 文件(Excel 用户表单和 VBA)

    我有一个 Excel 电子表格 其中包含使用日历控件的用户表单 它在我的机器上运行良好 但其他人无法使用它 因为他们缺少 mscomct2 ocx 文件 我找到了下载地址 http support microsoft com kb 2973
  • Angular2将数据映射为特定对象类型

    我根据 Angular2 教程创建了一个非常简单的应用程序 首先 我有一个非常简单的 Book 模型 book model export class Book public data constructor param id param t
  • 沿二维图像切片进行插值

    我有一套100相同大小的二维图像切片 我使用 MATLAB 将它们堆叠起来以创建体积数据 虽然二维切片的大小为 480x488 像素 但图像堆叠的方向不够宽 无法在投影时以不同方向可视化体积 我需要沿着切片进行插值以增加可视化的大小 有人可
  • Pandas 将具有 unix 时间戳(以毫秒为单位)的行转换为日期时间

    我需要处理大量 CSV 文件 其中时间戳始终是表示 UNIX 时间戳 以毫秒为单位 的字符串 我还找不到有效修改这些列的方法 这是我想到的 但是这当然只复制了列 我必须以某种方式将它放回原始数据集 我确信在创建时可以完成DataFrame
  • 不同组的不同子布局 ExpandableListView

    我在尝试执行此操作时遇到了问题 我似乎无法做到这一点 我想控制每个父母 该父母的孩子 ExpandableListView一直让我头疼 包评论 public class CommentsExpandableListAdapter exten
  • 对整数的多维向量进行排序?

    不管你信不信 当我搜索这个时 我想出了什么 如何对多维数据进行排序vector of int是在其中一根 柱子 旁边吗 提前谢谢了 C res mysql perform query conn SELECT column1 column2
  • 无法使用 rbenv 安装 RMagick

    我在 Ubuntu 10 04 服务器上使用 rbenv 并且已经安装了 ImageMagick 但无法成功安装 RMagick 我收到以下错误消息 Can t install RMagick 2 13 1 Can t find Magic
  • Microsoft Edge 中的集成 Windows 身份验证

    我正在尝试在 Edge 上实施集成 Windows 身份验证 但它总是提示我输入凭据 而集成 Windows 身份验证适用于 IE Chrome 和 Firefox 我尝试在安全选项中将该站点添加到本地 Intranet 站点并启用自动登录
  • 如何等待所有任务完成而不阻塞 UI 线程?

    在下面的代码中 我在处理任务之前禁用按钮 并希望在所有任务完成后启用它 List
  • 是否有经过充分研究的优化来找到穿过图形中每个加权边的最短路径?

    我一直在四处寻找 但似乎每个人最喜欢的问题都有一个稍微不同的情况 TSP 哈密顿量 欧拉等 我有一个图 由 V 顶点 和 E 边 表示 其中每条边是无向的 并且有一定的遍历成本 我想以最小的成本遍历每一条边 并可能重复 直观上 这个问题感觉
  • 在android中显示TextView而不是ImageView

    我想在图像视图上显示文本 我按照 Alesqui 的建议这样做 Android 文字覆盖图像 The preview in Android studio looks fine 但我的实际结果看起来像这样 上面有不必要的文本 我必须在执行期间
  • 在 Fortran 95 中将任意浮点字符串转换为实数

    在 fortran 中是否有任何简单的方法可以将任意浮点字符串转换为实数 想想类似的事情strtod 问题在于READ声明是所有浮点格式编辑描述符都需要显式宽度 到目前为止 我做出的最好的解决方法是这样的 pure function str
  • 有没有办法确定用户加入了哪些多用户会议 (MUCH)?

    我想知道是否有办法查询 XMPP 服务器 传递用户 JID 以找出该用户当前所在的聊天室 如果没有 我们可以查询 jabber 服务器来获取所有活动聊天室的列表吗 顺便说一句 我们正在运行支持多用户聊天的 ejabber 使用 java 库
  • 为什么我应该使用 Deque 而不是 Stack?

    我需要一个Stack我的用例的数据结构 我应该能够将项目推送到数据结构中 并且我只想从堆栈中检索最后一个项目 这堆栈的 JavaDoc says 一组更完整且一致的 LIFO 堆栈操作是 由 Deque 接口及其实现提供 应该 优先使用此类
  • 2x2 按钮网格布局

    我正在尝试创建一个包含 2x2 按钮网格 总共 4 个 的布局 我有以下内容 但它只在左上角创建按钮网格 我希望按钮网格填满整个屏幕
  • 设置输入框背景

    我必须创建一个具有以下背景的输入框 到目前为止 在我的代码中 我有下面的代码 但它没有显示 gt 执行此操作的正确程序是什么 我还必须制作此按钮的几个变体 如下所示 按钮黑色区域上的十字 我只是要使用 span 标记一个类并将图形设置为该类
  • 在 C++ 中从向量复制到向量

    我创建一个向量 A 并想使用以下方法复制到另一个类中的向量 B 这是正确的方法吗 向量A可能会被破坏 我在谷歌搜索 但没有找到好的解决方案和有意义的解释 感谢大家 void StateInit vector
  • Android 上的 OpenId

    我想让我的用户能够使用他们的 OpenId 登录我的 Android 应用程序 有一个像 StackOverflow 一样的文本字段 并要求用户在那里输入他的 OpenId 我环顾四周 但找不到任何允许我在 Android 上实现客户端 O
  • Laravel 5 Flysystem - 从远程磁盘下载文件

    我正在使用 Flysystem 在 Rackspace 上存储站点的文件 上传没问题 但无法弄清楚如何开始下载文件 这是我尝试过的 Storage disk rackspace return response gt download fil
  • 为什么追加documentFragment时需要使用cloneNode?

    我一直在考虑在 Backbone js 应用程序中使用 documentFragments 并且想知道为什么我看到在将 documentFragment 附加到父 DOM 元素时使用 cloneNode 的示例 可以看一个例子here 如果