Vorstellen:
<div id="old-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
<div id="new-parent"></div>
Welches JavaScript kann geschrieben werden, um alle untergeordneten Knoten (sowohl Elemente als auch Textknoten) von old-parent
nach zu verschieben?new-parent
, ohne jQuery?
Leerzeichen zwischen Knoten sind mir egal, obwohl ich davon ausgehe Hello World
, dass sie den Streuner auffangen , müssten sie auch so wie sie sind migriert werden.
BEARBEITEN
Um klar zu sein, möchte ich am Ende Folgendes haben:
<div id="old-parent"></div>
<div id="new-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
Die Antwort auf die Frage, aus der dies ein vorgeschlagenes Duplikat ist, würde ergeben:
<div id="new-parent">
<div id="old-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
</div>
javascript
html
dom-manipulation
Drew Noakes
quelle
quelle
Antworten:
DEMO
Grundsätzlich möchten Sie jeden direkten Nachkommen des alten übergeordneten Knotens durchlaufen und auf den neuen übergeordneten Knoten verschieben. Alle Kinder eines direkten Nachkommen werden damit bewegt.
var newParent = document.getElementById('new-parent'); var oldParent = document.getElementById('old-parent'); while (oldParent.childNodes.length > 0) { newParent.appendChild(oldParent.childNodes[0]); }
quelle
while (oldParent.childNodes.length) { newParent.appendChild(oldParent.firstChild); }
firstChild
. Der Unterschied ist bestenfalls vernachlässigbar. Es wird wahrscheinlich auch von Browser zu Browser unterschiedlich sein. Ich denkefirstChild
aber besser lesbar.while (oldParent.hasChildNodes()) newParent.appendChild(oldParent.firstChild);
undwhile (oldParent.firstChild) newParent.appendChild(oldParent.firstChild);
arbeiten 2x schneller in Chromium und 6x bis 10x schneller in Firefox. Ihr modifizierter JSPerfHier ist eine einfache Funktion:
function setParent(el, newParent) { newParent.appendChild(el); }
el
'schildNodes
sind die Elemente, die verschoben werden sollen,newParent
ist das Element,el
in das verschoben werden soll, so dass Sie die Funktion wie folgt ausführen würden:var l = document.getElementById('old-parent').childNodes.length; var a = document.getElementById('old-parent'); var b = document.getElementById('new-parent'); for (var i = l; i >= 0; i--) { setParent(a.childNodes[0], b); }
Hier ist die Demo
quelle
old-parent
Element auch verschieben, wenn Sie das als übergebenel
.<div id="new-parent"><div id="old-parent">...</div></div>
for (var i = l; i >= 0; i--)
oderwhile (document.getElementById('old-parent').length > 0)
. Außerdem enthält Ihre Demo Fehler.while (document.getElementById('old-parent').length > 0) { setParent(document.getElementById('old-parent')[i], document.getElementById('new-parent')); }
Moderne Art:
.append
ist der Ersatz für.appendChild
. Der Hauptunterschied besteht darin, dass mehrere Knoten gleichzeitig und sogar einfache Zeichenfolgen akzeptiert werden.append('hello!')
oldParent.childNodes
ist iterierbar, so dass es mit...
mehreren Parametern von verbreitet werden kann.append()
Kompatibilitätstabellen von beiden (kurz: Edge 17+, Safari 10+):
quelle
append
Anruf statt vieler ist.while()
ist in Chrome immer noch etwas schneller. Nehmen Sie nicht mein Wort und führen Sie wenn möglich Ihre eigenen Tests durch.Diese Antwort funktioniert nur dann wirklich, wenn Sie nichts anderes tun müssen, als den inneren Code (innerHTML) von einem zum anderen zu übertragen:
// Define old parent var oldParent = document.getElementById('old-parent'); // Define new parent var newParent = document.getElementById('new-parent'); // Basically takes the inner code of the old, and places it into the new one newParent.innerHTML = oldParent.innerHTML; // Delete / Clear the innerHTML / code of the old Parent oldParent.innerHTML = '';
Hoffe das hilft!
quelle
Wenn Sie
-
die Namen der ID nicht verwenden , können Sie dies tunoldParent.id='xxx'; newParent.id='oldParent'; xxx.id='newParent'; oldParent.parentNode.insertBefore(oldParent,newParent);
#newParent { color: red }
<div id="oldParent"> <span>Foo</span> <b>Bar</b> Hello World </div> <div id="newParent"></div>
quelle