关于JQuery的clone方法无法拷贝data缓存数据的问题。

今天遇到一个问题,发现JQuery在clone后缓存在对象内的缓存data不见了,百思不得其解,原来是JQuery1.3.2之后改变了做法。

jQuery复制节点clone()方法不会复制data缓存,准确说jQuery不会在全局缓存对象中分配一个新节点存放新复制elem缓存。 jQuery在clone()中把可能存在的缓存指向属性(elem的expando属性)替换成空。如果直接把这个属性复制,就会导致原先和新复制的 elem都指向一个数据缓存,中间的互操作都将会影响到两个elem的缓存变量。以下jQuery代码就是把expando属性删除 (jQuery1.3.2,较早版本不是这样处理,显然新版本的这个方法性能更好)

jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];

把数据缓存一起复制有时候也是很有用的,比如在拖动操作中,我们点击源目标elem节点就会复制出一个半透明的elem副本开始拖动,并把data缓存复 制到拖动层中,等到拖动结束,我们就可能取到当前拖动的elem相关信息。现在jQuery方法没有给我们提供这样的处理,怎么办法。第一个办法是改写 jQuery代码,这个方法显然很傻,很不科学。正确做法是复制源目标的data,把这些data都重新设置到复制出来的elem中,这样在执行 data(name, value)方法时,jQuery会在全局缓存对象中为我们开辟新空间。实现代码如下:

if (typeof($.data(currentElement)) == 'number') 
{
    var elemData = $.cache[$.data(currentElement)];
    for (var k in elemData) 
    {
        dragingDiv.data(k, elemData[k]);
    }
}
在上面代码中,$.data(elem,name,data)包含三个参数,如果只有一个elem参数,这个方法返回它的缓存key(即uuid),利用这个key就可以得到整个缓存对象,然后把对象的数据都复制到新的对象。

你可能感兴趣的:(jquery,clone,Data,无法复制)