【问题标题】:Does jquery clone() user documentfragment internally?jquery clone() 用户文档片段是否在内部?
【发布时间】:2010-10-09 02:13:27
【问题描述】:

我正在动态地将元素插入到 dom 中,为此我使用以下步骤:(jquery)初始 dom 结构如下:

<div parent div>
 </div>
 <div child div template>
</div>
  • 使用 jquery .clone() 克隆父 div
  • 克隆子 div 并进行操作
  • 附加到克隆的父级
  • 对所有子数据执行此操作
  • (parentdiv original).replaceAll(clonedparent)

基本上我想以某种方式克隆父 div,以便它可以作为 documentfragment 等附加不会发生在 dom 上并获得性能。

jQuery clone() 会通过表现得像文档片段来提供性能优势吗? 还是有更好的方法来做到这一点?我不想将每个子元素构造为 HTML 字符串,因为它们的结构非常复杂。

【问题讨论】:

  • 您的示例代码的第 2 行和第 3 行是否向后?看来您希望它是嵌套的 div。
  • 不,它们是 2 个单独的 div,第一个是我想在其中创建子 div 的父 div,另一个只是一个模板 div,用于克隆并在父级内部创建子 div一个..
  • 为什么要克隆父div?在您以某种方式插入之前,文档中不存在克隆的元素。

标签: javascript jquery documentfragment


【解决方案1】:

jQuery clone() 做一个普通的 DOM cloneNode(),除了在 IE 上,如果你这样做,它会不恰当地复制事件监听器。为了解决这个问题,在 IE 上,jQuery 做了一些你不想知道的完全可怕的事情。哪个不快。

replaceAll() 也不快。它必须从 DOM 中删除每个子节点(这在 jQuery 中特别慢,因为在从 DOM 中删除某些内容时需要检查data)并逐个添加新节点。

我真的不明白克隆是什么让你真正来到这里。直接对孩子进行操作即可。如果您有很多操作要做并且您正在触发重新布局使其变慢,您可以暂时从文档中隐藏父级或 detach 它,完成后重新附加它。

【讨论】:

  • 感谢您的详细回答。我正在克隆子元素,因为我正在动态创建新的子元素,为此我正在支持模板子元素,克隆它然后附加。孩子们事先不存在,因此无法通过 detach 进行操作,在这种情况下我该怎么办,我必须使用某种模板创建新的孩子..
  • 好的,克隆并附加孩子,但您也不需要克隆父母。如果您确定需要,您可以分离并重新附加父级。
  • 我希望克隆许多子元素没问题..有没有其他方法可以克隆子元素?
  • 有什么可怕的?
  • @1252748 在撰写本文时,jQuery 抓取了源节点的outerHTML,用正则表达式对其进行处理以尝试删除随机编号的jQueryNNNNNN="NNNN" 内部ID 属性(这是不可靠的) ,更多地使用正则表达式来提取&lt;script&gt; 元素并将结果写回到一组包装器中。不知道它是否仍然这样做......我希望不会,因为它不再支持错误克隆事件侦听器的 IE 版本。
猜你喜欢
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
相关资源
最近更新 更多