У меня есть объекты, которые только ссылки являются элементами DOM, к которым они привязаны, и я не уверен, что если вызов $element.remove()
фактически удаляет ссылку или только элемент DOM. Вот пример кода.
var Foo = function() {
var constructor = function Foo() {
var col = '#'+(Math.random()*0xFFFFFF<<0).toString(16);
var $container = $('<div class="element" style="background-color:'+col+';"></div>');
var $remove = $('<input type="button" value="Delete" />');
$container.append($remove);
$('#wrapper').append($container);
$remove.on('click', function() {
$container.remove();
});
};
return constructor;
}();
$('#addElement').on('click', function() {
new Foo();
});
И jsfiddle для людей, с которыми можно поиграть. Нажмите одну кнопку, чтобы добавить элементы, щелкните каждый элемент "Удалить", чтобы удалить его; от DOM по крайней мере.
Это не обязательно проблема для моего текущего проекта из-за небольшого масштаба, но я думаю, было бы действительно полезно узнать для будущей справки, если я когда-либо работаю над чем-то большим.
Если это не так, есть ли способ удалить объекты, не удерживая их в каком-то массиве?
EDIT: Хорошо, поэтому я как-то ответил на свой вопрос, используя снимки хром-кучи и добавив 10000 элементов на страницу. Вот важные данные. (Я включил HTMLInputElements, потому что большинство из того, что я вставляю, это)
Initial 10,000 Removed
Memory 2.7MB 135MB 4.0MB
Objects 1,676 81,693 11,703
InputElements 1 59,995 1
Так что, кажется, сборщик мусора достаточно умен, чтобы удалить объекты, когда элемент DOM, ссылающийся на них, удаляется. Хотя это не идеально.
Объекты будут собирать мусор, как только вы больше не будете ссылаться на объект. Я не уверен, что это будет считаться "лучшей практикой" для этого. Из MDN:
С другой стороны, значения JavaScript выделяются, когда вещи (объекты, строки и т.д.) Создаются и "автоматически" освобождаются, когда они больше не используются.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management
"Автоматически", описанный выше в современных браузерах, означает, что объекты, которые считаются "недоступными", будут помечены для сбора мусора.
Вызов $.element.remove() приведет к удалению только элемента DOM, поскольку он знает только об элементе DOM. Невозможно, чтобы он мог удалить любой другой объект, связанный с элементом DOM, потому что он не знает об этом объекте.
detach
иremove
( api.jquery.com/detach , api.jquery.com/remove ). В конце концов, ваш элемент все еще здесь, после того как вы удалили его из DOM - вы можете добавить его снова ($container.appendTo('body');
). Приremove
вы просто потеряли все данные и события, связанные с ним. Если вы действительно хотите полностью избавиться от этого, вы можете сделать$container = null;
после удаления из DOM.$container
а от экземпляра Foo.