2

我有一个包含几个子节点的 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
4

1 回答 1

1

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

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

在这种情况下,我认为您不会通过使用片段来获得任何收益。

于 2010-05-14T02:15:39.017 回答