использование jQuery remove () вызывает утечку памяти - PullRequest
1 голос
/ 13 февраля 2012

У меня есть div, в котором я часто создаю дочерние div, а затем удаляю их.Функция вставки выглядит следующим образом.

var insert = function(container, content) {
    content = $(content);
    container.append(content);
    return content;
};

var newContent = insert($('#container'), '<div>new content</div>');

// later
newContent.remove();

Контейнер является объектом jQuery.содержимое представляет собой строку типа <div>new content</div>.Позже этот новый контент удаляется.

Div правильно удаляется из dom, но с помощью функции профилирования chrome я вижу, как увеличивается и растет память.Профиль показывает список строк, тысячи из которых являются моим удаленным контентом.Отслеживая его, я вижу, что у jquery есть свойство, называемое фрагментами.

$.fragments - это карта, где ключевые строки представляют собой фрагменты HTML (буквально <div>new content</div> - это ключевая строка), а значения - объекты DocumentFragment.

Объекты DocumentFragment содержат свойство «native», которое содержит значение типа «Отдельное дерево DOM».И есть мой отсоединенный объект.

Кажется, проблема в том, что jQuery не сбрасывает эту коллекцию $.fragments.Я использую jQuery 1.7.1.

Одна из возможных причин, по которой я это вижу, заключается в том, что ключи карты - это HTML, который был вставлен, но к тому времени, когда я дохожу до удаления фрагмента, я 'Мы изменили атрибуты div новогоContent.

Одним из возможных решений является сохранение пула неиспользуемых новых div содержимого и повторное их использование.Я на самом деле не хочу этого делать, но это может быть разумно.

1 Ответ

1 голос
/ 13 февраля 2012

Похоже, что jQuery использует $.fragments для ускорения $("<...>").

Полагаю, использование $("<div>").html(...) не будет использовать кеш, но, очевидно, семантически отличается.

Вы можете просто попытаться иногда промыть $.fragments самостоятельно и посмотреть, что произойдет.У меня есть чувство, что все пойдет так же, как и ожидалось, без каких-либо побочных эффектов.

Я не думаю, что у jQuery действительно есть способ отследить использование самого кеша фрагментов, и кеш LRU или что-то подобное, вероятно, будет медленнее, не говоря уже о дополнительных трудностях реализации.

...