Удаляйте и добавляйте элементы из одной и той же позиции в группе привязки svg

#javascript #html #svg #snap.svg

Вопрос:

У меня есть группа svg из 5 элементов, таких как;

 let canvas = Snap('#svg');
let myGroup = canvas.g();

myGroup.add(canvas.rect(100, 200, 110, 220).attr({fill: '#000'}));
myGroup.add(canvas.circle(400, 400, 50).attr({fill: '#500'}));

// want to remove this element later
myGroup.add(canvas.rect(100, 200, 50, 60).attr({fill: '#050'}));

myGroup.add(canvas.text(50, 100, 'Some Text').attr({stroke: '#005'}));
myGroup.add(canvas.rect(700, 200, 110, 220).attr({fill: '#055'}));
 

Затем я могу получить доступ к конкретным элементам myGroup использования индекса, например, если я хочу изменить атрибуты текста, которые я могу использовать myGroup[3] , потому что он находится на 3-м индексе myGroup .

Теперь я хочу удалить элемент со 2-го индекса, а затем добавить какой-то другой элемент с тем же индексом, поэтому я использовал remove() такой метод, как;

 myGroup[2].remove();
myGroup.add(canvas.path('M 100 200 l 30 35').attr({stroke: '#050'}));
 

но проблема в том, что элементы 3-го и 4-го индексов были сдвинуты вверх (2-й и 3-й соответственно), и в 4-й индекс был добавлен новый элемент.

Кто-нибудь знает, как я могу добавить элемент с тем же индексом?

Комментарии:

1. В DOM есть .replaceWith , но я не знаю, как Snap будет с этим справляться: developer.mozilla.org/en-US/docs/Web/API/ChildNode/replaceWith

2. Элементы Snap.svg выдают ошибку, говорящую myGroup[2].replaceWith , что это не функция

Ответ №1:

вы можете использовать insertAfter или insertBefore метод для достижения этой цели.

Пример:

Если хотите, замените узел из группы canvas индексом 2. удалите узел с помощью remove метода.

 myGroup[2].remove();
 

и вставьте новый узел с insertBefore помощью метода

 canvas.path('M 100 110 l 30 35').attr({
   stroke: '#050'
}).insertBefore(myGroup[2]);
 

это заменит старый узел новым.

Пример Решения:

 let canvas = Snap('#svg');

let myGroup = canvas.g();

myGroup.add(canvas.rect(100, 110, 110, 220).attr({
  fill: '#000'
}));
myGroup.add(canvas.circle(400, 400, 50).attr({
  fill: '#500'
}));

// want to remove this element later
myGroup.add(canvas.rect(100, 110, 50, 60).attr({
  fill: '#050'
}));

myGroup.add(canvas.text(50, 100, 'Some Text').attr({
  stroke: '#005'
}));
myGroup.add(canvas.rect(700, 200, 110, 220).attr({
  fill: '#055'
}));

function replaceElement() {
  myGroup[2].remove();
  canvas.path('M 100 110 l 30 35').attr({
    stroke: '#050'
  }).insertBefore(myGroup[2]);
} 
 #svg {
  width: 500px;
  height: 500px;
}

button {
  display: block;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.5.1/snap.svg-min.js" integrity="sha512-Gk uNk8NWN235mIkS6B7/424TsDuPDaoAsUekJCKTWLKP6wlaPv PBGfO7dbvZeibVPGW mYidz0vL0XaWwz4w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<button onclick="replaceElement()">replace</button>
<svg id="svg"></svg> 

Комментарии:

1. В моем случае это должно быть canvas.path('M 100 110 l 30 35').attr({stroke: '#050' }).insertAfter(myGroup[2]); Ref: http://snapsvg.io/docs/#Element.insertAfter . Кстати, это решило мою проблему. Спасибо

2. @kapilsarwat Обновил решение