【问题标题】:documentFragment.cloneNode(true) doesn't clone jQuery datadocumentFragment.cloneNode(true) 不克隆 jQuery 数据
【发布时间】:2015-12-21 02:49:44
【问题描述】:

我有一个包含几个子节点的 documentFragment,其中添加了一些 .data(),如下所示:


myDocumentFragment = document.createDocumentFragment();
for(...) {
  myDocumentFragment.appendChild(
    $('<a></a>').addClass('button')
      .attr('href', 'javascript:void(0)')
      .html('click me')
      .data('rowData', { 'id': 103, 'test': 'testy' })
      .get(0)
  );
}

当我尝试将 documentFragment 附加到页面上的 div 时:

$('#div').append( myDocumentFragment );

我可以正常访问数据:

alert( $('#div a:first').data('rowData').id ); // alerts '103'

但是如果我用 cloneNode(true) 克隆节点,我就无法访问节点的数据。 :(

$('#div').append( myDocumentFragment.cloneNode(true) );
...
alert( $('#div a:first').data('rowData').id ); // alerts undefined

有其他人这样做过或知道解决方法吗?我想我可以将行的数据存储在 jQuery.data('#some_random_parent_div', 'rows', [array of ids]) 中,但这有点违背了让数据立即/轻松地提供给每一行的目的。

我还读到 jQuery 使用 documentFragments,但我不确定具体如何使用,或者使用什么方法。有没有人有更多的细节?

重新编辑:.clone(true)


$(globalObj).data('fragment', { frag: $(mydocumentFragment).clone(true) });

$(myDocumentFragment).clone(true).appendTo('#div');

alert( $('#div a:first').data('rowData').id ); // undefined

【问题讨论】:

  • `$('')` 是做什么的?你没有在那里创建一个元素,所以我不确定会发生什么样的行为......
  • @Nick - 我认为这是一个错字。在前几天的一个问题中,他使用的是$('&lt;a&gt;')
  • 是的,堆栈溢出吃掉了那里的a标签,哎呀。

标签: javascript jquery documentfragment clonenode


【解决方案1】:

当您执行$('a') 时,您正在创建一个jQuery 对象,但是当您使用get(0) 并使用appendChild 将其附加到您的片段时,您将其留在后面。因此,如果您在片段上使用本机 .cloneNode(true),jQuery 不会意识到它,因此不会为您管理数据。

只要您的大部分工作都使用 jQuery,我会说放弃 documentFragment,只需将您的 a 元素填充到 jQuery 对象中,然后 clone() 即可。

我认为在这种情况下使用片段不会有任何好处。

【讨论】:

  • 谢谢这可能是我最终要做的,我要放弃了:)
  • 是的,如果你打算使用.data(),你应该计划坚持使用jQuery。如果你能在没有它的情况下过日子,你会更容易成为本地人。
  • 真的。好吧,拧它。 :) 无论如何感谢您的帮助,我很感激。在旁注中,我尝试了 $list = $({});并得到一个错误,说 doc.createDocumentFragment 不是 jquery-1.4.2.js 中的函数 - 所以如果我将其更改为 $('
    ') 看起来他们无论如何都在使用 documentFragments !凉爽的。再次感谢。
猜你喜欢
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多