У меня есть html-код, который выглядит примерно так:
<div id = "id1">
<div id = "id2">
<p>some html</p>
<span>maybe some more</span>
</div>
<div id = "id3">
<p>different text here</p>
<input type = "text">
<span>maybe even a form item</span>
</div>
</div>
Очевидно, дело не только в этом, но это основная идея. Что мне нужно сделать, так это поменять местами # id2 и # id3, чтобы результат был таким:
<div id = "id1">
<div id = "id3">...</div>
<div id = "id2">...</div>
</div>
Кто-нибудь знает о функции (я уверен, что я не первый, кому эта функция требуется), которая может читать и записывать два узла (и всех их дочерних узлов), чтобы поменять местами их расположение в DOM?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В этом случае document.getElementById('id1').appendChild(document.getElementById('id2')); должен помочь.
В более общем плане вы можете использовать insertBefore().
Эта функция берет любой переданный ей узел и обертывает его заданным тегом. В примере фрагмента кода я заключил тег диапазона в тег раздела.
function wrap(node, tag) {
node.parentNode.insertBefore(document.createElement(tag), node);
node.previousElementSibling.appendChild(node);
}
function wrap(node, tag) {
node.parentNode.insertBefore(document.createElement(tag), node);
node.previousElementSibling.appendChild(node);
}
let toWrap = document.querySelector("#hi");
wrap(toWrap, "section");
console.info(document.querySelector("section > #hi"), " section wrapped element");<span id = "hi">hello there!</span>
.prepend()может быть тем, что некоторые тоже ищут. Вот краткий список более полезных методов.