Куда идут объекты .detach-ed? - PullRequest
       3

Куда идут объекты .detach-ed?

1 голос
/ 27 сентября 2010

У меня есть что-то вроде этого:
// 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.

1 Ответ

2 голосов
/ 27 сентября 2010

В этом случае переменная 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()
...