torbach
@torbach

Почему дочерние элементы странно удаляются?

Подскажите, пожалуйста, почему дочерние элементы .output удаляются не все, перед заполнением.

https://codepen.io/Ramov/pen/eYjwbPx
  • Вопрос задан
  • 81 просмотр
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
children – «живая» коллекция. Поэтому цикл
for (let i = 0; i < childrens.length; i++){
  childrens[i].remove();
}
удаляет через одного.

Вот, например, вариант:
while (childrens.length) {
  childrens[0].remove();
}
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
output.children имеет тип HTMLCollection.
An HTMLCollection in the HTML DOM is live; it is automatically updated when the underlying document is changed.

Таким образом, при удалении, например, элемента с индексом 0, коллекция перестраивается, все элементы смещаются, элемент, имевший индекс 1, получает индекс 0 и остаётся в списке, так как следующим вы удаляете элемент с идексом 1 (изначально 2).
Решить можно несколькими способами:
--let childrens = output.children;
++let childrens = [...output.children];

--for(let i = 0; i < childrens.length; i++){
--  childrens[i].remove();
++while (childrens.length > 0) {
++  childrens[0].remove();

--let childrens = output.children;
--for(let i = 0; i < childrens.length; i++){
--  childrens[i].remove();
--}
++output.innerHTML = '';
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
gtomilin
@gtomilin
JavaScript HTML CSS
  1. Неверно делать const output = form.nextElementSibling; - в будущем могут появиться новые элементы и nextElementSibling будут недействительным, надо получить ссылку на конкретный элемент document.querySelector('.output')
  2. Children сохраняет предыдущее значение и результате получается такой эффект. Подробнее тут
  3. Два варианта как решить

//Удаление дочерних элементов перед заполнением
  let childrens = [...output.children]; 
  childrens.forEach(item => item.remove())


//Удаление дочерних элементов перед заполнением
  output.innerHtml = ''
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы