【问题标题】:Where do .detach-ed objects go?.detach-ed 对象去哪里了?
【发布时间】:2011-04-17 20:12:42
【问题描述】:

我有这样的事情:
//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',从中取出按钮而不是销毁它?

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

【问题讨论】:

    标签: javascript jquery dom dom-manipulation


    【解决方案1】:

    在这种情况下,buttons 变量创建一个对分离元素的子元素的引用,并且会阻止该元素被垃圾回收,至少在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 的引用,它是#b 的一部分,因此不能被垃圾回收。

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

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

    【讨论】:

    • 所以...如果我写这个:buttons = lookup.find('.tools').detach().find('a').detach(); 然后我会破坏那个引用并且'.panel' 将被垃圾收集?
    • @NilColor,不。您的更改从 .tools 中分离了“a”元素,但按钮仍保持对 .tools 的引用。面板不会被 GC,因为它被查找变量引用,并且因为您没有从 DOM 中删除它。
    • buttons = lookup.find('.tools').detach().find('a').detach(); 不会创建对“.tools”元素的引用,不是吗?最后buttons 指向一个a 元素数组,该数组从'.tools' 中分离出来,而'.tools' 又与lookup 分离。不?而且因为它们都是分离的 - 你在答案中提到的 DOM 层次结构没有问题。
    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2014-02-02
    • 2019-08-04
    相关资源
    最近更新 更多