Wyobrażać sobie:
<div id="old-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
<div id="new-parent"></div>
Jaki JavaScript można napisać, aby przenieść wszystkie węzły potomne (zarówno elementy, jak i węzły tekstowe) z old-parent
do new-parent
bez jQuery?
Nie obchodzą mnie spacje między węzłami, chociaż spodziewam się, że złapię zbłąkane Hello World
, musiałyby zostać przeniesione tak, jak są.
EDYTOWAĆ
Żeby było jasne, chcę skończyć z:
<div id="old-parent"></div>
<div id="new-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
Odpowiedź na pytanie, z którego jest to proponowany duplikat, skutkowałaby:
<div id="new-parent">
<div id="old-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
</div>
javascript
html
dom-manipulation
Drew Noakes
źródło
źródło
Odpowiedzi:
PRÓBNY
Zasadniczo chcesz przejść przez każdy bezpośredni potomek starego węzła nadrzędnego i przenieść go do nowego węzła nadrzędnego. Wszelkie dzieci bezpośredniego potomka zostaną nim poruszone.
var newParent = document.getElementById('new-parent'); var oldParent = document.getElementById('old-parent'); while (oldParent.childNodes.length > 0) { newParent.appendChild(oldParent.childNodes[0]); }
źródło
while (oldParent.childNodes.length) { newParent.appendChild(oldParent.firstChild); }
firstChild
. W najlepszym przypadku różnica jest znikoma. Prawdopodobnie będzie się to również różnić w zależności od przeglądarki. Myślę jednak, żefirstChild
jest bardziej czytelny.while (oldParent.hasChildNodes()) newParent.appendChild(oldParent.firstChild);
iwhile (oldParent.firstChild) newParent.appendChild(oldParent.firstChild);
pracuj 2x szybciej w Chromium i od 6x do 10x szybciej w Firefoksie. Twój zmodyfikowany JSPerfNowoczesny sposób:
.append
jest zamiennikiem.appendChild
. Główną różnicą jest to, że akceptuje wiele węzłów jednocześnie, a nawet zwykłe ciągi, takie jak.append('hello!')
oldParent.childNodes
jest iterowalny, więc można go rozprzestrzeniać,...
aby stać się wieloma parametrami.append()
Tabele kompatybilności obu (w skrócie: Edge 17+, Safari 10+):
źródło
append
połączenie zamiast wielu.while()
nadal jest trochę szybszy w Chrome. Nie wierz mi na słowo i jeśli to możliwe, wykonuj własne testy.Oto prosta funkcja:
function setParent(el, newParent) { newParent.appendChild(el); }
el
„schildNodes
są elementy do przeniesienia,newParent
jest elementemel
zostaną przeniesione, więc można wykonać funkcji takich jak: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); }
Oto Demo
źródło
old-parent
elementu, jeśli podasz go jakoel
.<div id="new-parent"><div id="old-parent">...</div></div>
for (var i = l; i >= 0; i--)
lubwhile (document.getElementById('old-parent').length > 0)
. Twoje demo zawiera również błędy.while (document.getElementById('old-parent').length > 0) { setParent(document.getElementById('old-parent')[i], document.getElementById('new-parent')); }
Ta odpowiedź naprawdę działa tylko wtedy, gdy nie musisz robić nic innego niż przenoszenie kodu wewnętrznego (innerHTML) z jednego na drugi:
// 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 = '';
Mam nadzieję że to pomoże!
źródło
Jeśli nie używasz
-
w nazwach id, możesz to zrobićoldParent.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>
źródło