Представить:
<div id="old-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
<div id="new-parent"></div>
Что JavaScript можно записать , чтобы переместить все дочерние узлы (как элементы и текстовые узлы) от old-parent
к new-parent
без JQuery?
Меня не волнуют пробелы между узлами, хотя я рассчитываю поймать заблудших Hello World
, их тоже нужно будет перенести как есть.
РЕДАКТИРОВАТЬ
Чтобы быть ясным, я хочу закончить:
<div id="old-parent"></div>
<div id="new-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
Ответ на вопрос, из которого предлагается дубликат, приведет к:
<div id="new-parent">
<div id="old-parent">
<span>Foo</span>
<b>Bar</b>
Hello World
</div>
</div>
javascript
html
dom-manipulation
Дрю Ноукс
источник
источник
Ответы:
ДЕМО
По сути, вы хотите перебрать каждого прямого потомка старого родительского узла и переместить его к новому родительскому узлу. Любые дети прямого потомка будут перемещены вместе с ним.
var newParent = document.getElementById('new-parent'); var oldParent = document.getElementById('old-parent'); while (oldParent.childNodes.length > 0) { newParent.appendChild(oldParent.childNodes[0]); }
источник
while (oldParent.childNodes.length) { newParent.appendChild(oldParent.firstChild); }
firstChild
. Разница в лучшем случае незначительна. Вероятно, это также будет отличаться от браузера к браузеру. Я думаю, чтоfirstChild
это более читабельно.while (oldParent.hasChildNodes()) newParent.appendChild(oldParent.firstChild);
иwhile (oldParent.firstChild) newParent.appendChild(oldParent.firstChild);
работайте в 2 раза быстрее в Chromium и в 6-10 раз быстрее в Firefox. Ваш измененный JSPerfСовременный способ:
.append
является заменой.appendChild
. Основное отличие состоит в том, что он принимает сразу несколько узлов и даже простые строки, например.append('hello!')
oldParent.childNodes
является итеративным, поэтому его можно распространять,...
чтобы он стал несколькими параметрами.append()
Таблицы совместимости обоих (кратко: Edge 17+, Safari 10+):
источник
append
звонок вместо множества.while()
все еще немного быстрее в Chrome. Не верьте мне на слово и, если возможно, проведите свои собственные тесты.Вот простая функция:
function setParent(el, newParent) { newParent.appendChild(el); }
el
'schildNodes
- это элементы, которые нужно переместить,newParent
это элемент,el
который будет перемещен, поэтому вы должны выполнить такую функцию, как: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); }
Вот демо
источник
old-parent
элемент, если вы передадите это какel
.<div id="new-parent"><div id="old-parent">...</div></div>
for (var i = l; i >= 0; i--)
илиwhile (document.getElementById('old-parent').length > 0)
. Кроме того, в вашей демонстрации есть ошибки.while (document.getElementById('old-parent').length > 0) { setParent(document.getElementById('old-parent')[i], document.getElementById('new-parent')); }
Этот ответ действительно работает, только если вам не нужно ничего делать, кроме передачи внутреннего кода (innerHTML) от одного к другому:
// 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 = '';
Надеюсь это поможет!
источник
Если вы не используете
-
в именах идентификаторов, вы можете сделать это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>
источник