.detach-ed对象去哪里了?

时间:2010-09-27 15:19:49

标签: javascript jquery dom dom-manipulation

我有这样的事情:
// HTML

<div class="panel">
    <div class="tools">
        <a href="#action1">Action 1</a>
        <a href="#action1">Action 1</a>
        <a href="#action1">Action 1</a>
    </div>
    <div class="list">
        <table>...</table>
    </div>
</div>

// JavaScript(jQuery)

var lookup = $('.panel'),
    buttons = lookup.find('.tools').detach().find('a');
...
//append buttons somewhere

所以,在这里我'.tools''.panel'分离,然后我拿了按钮并将它们附加到其他地方。但是'.tools'节点呢?它是垃圾收集还是没收?我是否必须保存分离的'.tools',从中取出按钮而不是销毁它?

如果它的问题 - 通过AJAX请求接收html部分,并且所有这些代码都在success处理程序内。

1 个答案:

答案 0 :(得分:2)

在这种情况下,buttons变量创建对分离元素的子元素的引用,并且将阻止元素被垃圾收集,至少在按钮超出范围之前。

修改

为了收集垃圾,需要将其与DOM分离,并且必须没有引用该元素的JavaScript变量(或分离节点树中的任何元素)

例如:

<div id="a">
  <div id="b">
    <div id="c">
        <div id="d"></div>
    </div>
  </div>
</div>

如果要分离“#b”并将其收集垃圾,则不能有任何指向元素b,c或d的变量。

这不起作用:

var c = $('#c')

$('#b').detach()

var c会保留对#c元素#c的引用,因此不能进行垃圾回收。

这也不起作用,因为detach返回对要分离的元素的引用。

var b = $('#b').detach()