おおよそ次のような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内の位置を交換するために2つのノード(およびそのすべての子)を読み書きできる関数(私がこの機能を最初に要求する人ではないと確信しています)を知っている人はいますか?
この場合、document.getElementById('id1').appendChild(document.getElementById('id2'));
がうまくいくはずです。
より一般的には、insertBefore()
を使用できます。
この関数は、渡されたノードを受け取り、指定されたタグでラップします。例のコードスニペットでは、spanタグをセクションタグでラップしました。
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.log(document.querySelector("section > #hi"), " section wrapped element");
<span id="hi">hello there!</span>