documentFragment.cloneNode(true)不克隆jQuery数据

时间:2010-05-14 01:58:42

标签: javascript jquery documentfragment clonenode

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

1 个答案:

答案 0 :(得分:0)

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

只要你正在为你正在做的大部分事情使用jQuery,我就会抛弃documentFragment,只将你的a元素填充到jQuery对象中,然后clone()

在这种情况下,我不认为你通过使用片段获得任何东西。