The new child element contains the parent. при создании блока div через const

Возникает ошибка при создании блока div. Первый блок div создался без проблем в body с id root, после я присвоил класс firstContainer, чтобы при помощи класса добавить div внутрь 1 блока div

const div = document.createElement('div');
document.querySelector('#root').append(div)
document.body.lastElementChild.classList.add('firstContainer')

Но, когда я хочу добавить внутрь таким образом:

document.querySelector('.firstContainer').append(div)

Возникает нелогичная мне, но логичная браузеру ошибка, что child содержит parent. Ведь я просто упростил код const div ...//, но вот так работает

document.querySelector('.firstContainer').append(document.createElement('div'))

const div = document.createElement('div');
document.querySelector('#root').append(div)
document.body.lastElementChild.classList.add('firstContainer');
document.querySelector('.firstContainer').append(div)
<body id="root"></body>


Ответы (1 шт):

Автор решения: Grundy

Основная проблема в коде не в том, что document.createElement('div'), а в том, что эта переменная используется дважды.

  1. добавляется в элемент с id="root"
  2. добавляется в элемент с class="firstContainer"

Однако, во втором случае элементом с class="firstContainer" является тот самый див, который хранится в переменной.

Из-за этого возникает парадокс: попытка добавить элемент, в самого себя.

И, как следствие, ошибка.

Для добавления нового элемент, нужно его просто создать перед добавлением.

Например:

const div = document.createElement('div');
document.querySelector('#root').append(div)
document.body.lastElementChild.classList.add('firstContainer');
var container = document.querySelector('.firstContainer');

console.log(container === div);

const div2 = document.createElement('div');
document.querySelector('.firstContainer').append(div2);
.firstContainer {
  width: 100px;
  height: 100px;
  border: 2px solid red;
}

.firstContainer>div {
  border: 1px solid green;
  width: 50px;
  height: 50px;
}
<body id="root"></body>

→ Ссылка