Imagina:
<div id="old-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
<div id="new-parent"></div>
¿Qué JavaScript se puede escribir para mover todos los nodos secundarios (tanto elementos como nodos de texto) de old-parent
a new-parent
sin jQuery?
No me importa el espacio en blanco entre los nodos, aunque espero atrapar a los extraviados Hello World
, también tendrían que migrarlos como están.
EDITAR
Para ser claro, quiero terminar con:
<div id="old-parent"></div>
<div id="new-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
La respuesta a la pregunta de la que se trata de un duplicado propuesto resultaría en:
<div id="new-parent">
<div id="old-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
</div>
javascript
html
dom-manipulation
Dibujó Noakes
fuente
fuente
Respuestas:
MANIFESTACIÓN
Básicamente, desea recorrer cada descendiente directo del nodo padre antiguo y moverlo al nuevo padre. Cualquier hijo de un descendiente directo se moverá con él.
var newParent = document.getElementById('new-parent'); var oldParent = document.getElementById('old-parent'); while (oldParent.childNodes.length > 0) { newParent.appendChild(oldParent.childNodes[0]); }
fuente
while (oldParent.childNodes.length) { newParent.appendChild(oldParent.firstChild); }
firstChild
. La diferencia es insignificante en el mejor de los casos. Probablemente también variará de un navegador a otro. SinfirstChild
embargo, creo que es más legible.while (oldParent.hasChildNodes()) newParent.appendChild(oldParent.firstChild);
ywhile (oldParent.firstChild) newParent.appendChild(oldParent.firstChild);
trabaja 2 veces más rápido en Chromium y de 6 a 10 veces más rápido en Firefox. Su JSPerf modificadoManera moderna:
.append
es el reemplazo de.appendChild
. La principal diferencia es que acepta varios nodos a la vez e incluso cadenas simples, como.append('hello!')
oldParent.childNodes
es iterable, por lo que puede extenderse...
para convertirse en múltiples parámetros de.append()
Tablas de compatibilidad de ambos (en resumen: Edge 17+, Safari 10+):
fuente
append
llamada en lugar de muchas.while()
todavía es un poco más rápido en Chrome. No tome mi palabra y realice sus propias pruebas si es posible.Aquí tienes una función simple:
function setParent(el, newParent) { newParent.appendChild(el); }
el
'schildNodes
son los elementos que se moverán,newParent
es el elemento alel
que se moverá, por lo que ejecutaría la función como: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); }
Aquí está la demostración
fuente
old-parent
elemento si lo pasara comoel
.<div id="new-parent"><div id="old-parent">...</div></div>
for (var i = l; i >= 0; i--)
owhile (document.getElementById('old-parent').length > 0)
. Además, su demostración tiene errores.while (document.getElementById('old-parent').length > 0) { setParent(document.getElementById('old-parent')[i], document.getElementById('new-parent')); }
Esta respuesta solo funciona realmente si no necesita hacer nada más que transferir el código interno (innerHTML) de uno a otro:
// 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 = '';
¡Espero que esto ayude!
fuente
Si no lo usa
-
en los nombres de identificación, puede hacer estooldParent.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>
fuente