2011-05-17 114 views
0

使用MooTools的,我在缓存变量的一些DOM元素,当DOM准备好,就像这样:失去参考的DOM元素后,我克隆它们

var mc = $('main-content'), 
    bg = $('bg'), 
    arrows = $$('arrows'); 

两个bgarrows位于mc DOM中元件。我想克隆mc节点,就可以执行某些操作,然后将克隆到DOM:

function updateDOM (parent) { 
    var parentID = parent.id, 
     oldNode = document.getElementById(parentID), 
     clone = oldNode.cloneNode(true); 

    // work with clone 

    oldNode.parentNode.replaceChild(clone, oldNode); 

} 

当我运行updateDOM(mc),我发现任何其他后续功能将改变mcbg,或arrows不工作。当我执行console.log()元素时,它们显示出来,但它们不反映自从初始化以来所做的任何更改。

考虑到我克隆了元素,我觉得mc不再引用div#main-contentupdateDOM()是一个可以被任何元素使用的函数。我是否真的需要硬编码一种方法来重新实例化每个我缓存的变量,或者是否存在一种更动态的方法?

+0

你的缓存代码看起来不正确......你的意思是把'#'放在选择器前面?或者这不是jQuery? – Jacob 2011-05-17 00:02:11

+0

@Jacob:不;它看起来像原型('$$') – SLaks 2011-05-17 00:05:40

+0

MooTools是准确的,我已经添加到该问题。对不起,有任何困惑。 – 2011-05-17 00:21:36

回答

0

updateDOM更改为返回新的克隆节点,并将您的调用更改为updateDOM以重新分配变量。

mc = updateDOM(mc); 
+0

其他缓存的元素如mc元素中的bg和箭头呢?由于使用updateDOM时它们驻留在mc中,所以我也失去了对它们的引用。 – 2011-05-17 01:02:27

+0

啊。没有注意到这种皱纹。除了直接修改元素而不是克隆和替换之外,我没有看到任何重新选择元素的更简单或更高效的替代方案。 – 2011-05-17 01:04:43

1
> function updateDOM (parent) { 
>  var parentID = parent.id, 
>   oldNode = document.getElementById(parentID), 
>   clone = oldNode.cloneNode(true); 

也许我厚,但在我看来,上述函数传递分配给元素参考。然后它使用getElementById(parent.id)来获取对相同元素的引用,然后克隆它。这与以下不同:

function updateDOM (parent) { 
    var clone = parent.cloneNode(true); 
+0

当我玩这个功能时,我发现我遇到了你所描述的方法问题。使用document.getElementById似乎在另一种方法没有的地方工作。那时我没有太多注意,所以我不能说为什么。 – 2011-05-17 16:43:28