#javascript #dom #appendchild
Вопрос:
Я пытаюсь добавить ребенка всегда на 2-й позиции в div, используя метод insertBefore (), это привело к ошибке.
var j = document.createElement('div');
j.innerHTML = '<p>CreateElement example</p>'
document.insertBefore(j, document.querySelector('.test').children[1]);
<div class="test">
<div class="first">
<p>hello world</p>
</div>
<div class="second">
<p>lorem</p>
</div>
<div class="third">
<p>Lorem, ipsum dolor.</p>
</div>
</div>
Ошибка:
Неперехваченное исключение DOMException: Не удалось выполнить «insertBefore» на «Узле»: Узел, перед которым должен быть вставлен новый узел, не является дочерним по отношению к этому узлу.
Ответ №1:
// First we find parent of elements
const parent = document.querySelector('.test');
// then create new div
var j = document.createElement('div');
// insert new div to parent
j.innerHTML = '<p>CreateElement example</p>'
parent.insertBefore(j, parent.childNodes[2]);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="script.js" defer></script>
</head>
<body>
<div class="test">
<div class="first">
<p>hello world</p>
</div>
<div class="second">
<p>lorem</p>
</div>
<div class="third">
<p>Lorem, ipsum dolor.</p>
</div>
</div>
</body>
</html>
Комментарии:
1. да, это работает. Чтобы вставить во вторую позицию, не должно ли это быть parent.insertBefore(j, parent.childNodes[1]); так как это массив и 0 индексируется. Я удивлен тем, как parent.insertBefore(j, parent.childNodes[2]); дает ожидаемый результат.