Snap.svg предоставляет несколько удобных способов для удаления
элементов из документа SVG. Основным методом является
remove(), который применяется к объекту элемента. Этот
метод полностью удаляет элемент из DOM, освобождая память и освобождая
место в графическом дереве.
var paper = Snap(800, 600);
var circle = paper.circle(100, 100, 50);
circle.remove(); // элемент удалён из документа
Метод remove() не требует дополнительных аргументов и
может вызываться на любом элементе, будь то rect,
circle, path или group. После
вызова элемента уже нельзя использовать для дальнейших манипуляций, если
только он не был заново создан.
Snap.svg позволяет объединять элементы в группы с помощью метода
group(). Удаление элемента из группы осуществляется тем же
методом remove(), но важно помнить, что удаление элемента
из группы не удаляет всю группу, только выбранный элемент.
var rect = paper.rect(10, 10, 100, 50);
var circle = paper.circle(60, 35, 20);
var g = paper.group(rect, circle);
circle.remove(); // удаляет только круг, прямоугольник остаётся
Для удаления всех элементов группы можно использовать метод
clear(), который полностью очищает группу, оставляя её
существующей, но пустой.
g.clear(); // удаляет все дочерние элементы группы
Иногда требуется удалить только определённые элементы,
соответствующие условию. Snap.svg поддерживает работу с селекторами и
методами фильтрации, такими как selectAll(). После выборки
элементов можно применять forEach() для удаления только тех
элементов, которые соответствуют заданным критериям.
var circles = paper.selectAll("circle");
circles.forEach(function(c) {
if (c.attr("r") > 30) {
c.remove();
}
});
В этом примере удаляются все круги с радиусом больше 30 единиц, оставляя меньшие элементы нетронутыми.
Snap.svg позволяет удалять дочерние элементы через родителя. Если
известно, что элемент является частью определённого контейнера или
группы, можно получить ссылку на родителя и вызвать метод
remove() для конкретного дочернего элемента.
var rect = paper.rect(20, 20, 50, 50);
var g = paper.group(rect);
g.forEach(function(el) {
if (el.type === "rect") {
el.remove();
}
});
Метод forEach() полезен для обхода всех дочерних
элементов, что позволяет реализовать более сложные стратегии удаления,
например, удаление по атрибутам или классам.
Иногда удаление элемента может быть необратимым, и лучше использовать
его временное скрытие. Для этого используется атрибут
display или метод attr():
circle.attr({ display: "none" }); // скрывает элемент
В отличие от remove(), элемент остаётся в DOM и может
быть показан повторно:
circle.attr({ display: "block" }); // элемент снова видим
remove() от
clear()remove() удаляет конкретный элемент полностью из DOM и
графического дерева.clear() очищает группу от всех дочерних элементов, но
сама группа остаётся доступной для дальнейшего использования.Эти методы часто комбинируются: clear() для подготовки
группы к новым элементам и remove() для точечного удаления
ненужных объектов.
Удаление большого количества элементов может повлиять на
производительность, если выполнять remove() в цикле на
сотнях объектов. Эффективнее использовать методы группировки и
выборки:
var circles = paper.selectAll("circle");
var group = paper.group(circles);
group.clear(); // удаление всех выбранных элементов за один вызов
Такой подход снижает количество отдельных операций с DOM и ускоряет рендеринг документа.
Если элемент участвует в анимации через метод animate(),
важно сначала остановить анимацию перед удалением, чтобы избежать
ошибок:
var rect = paper.rect(50, 50, 100, 50);
var anim = rect.animate({ x: 200 }, 1000);
anim.stop();
rect.remove();
Snap.svg корректно освобождает ресурсы после удаления, включая анимационные объекты, если они были остановлены или завершены.