Удалить все дочерние элементы узла DOM в JavaScript - PullRequest
728 голосов
/ 18 октября 2010

Как мне удалить все дочерние элементы узла DOM в JavaScript?

Скажем, у меня есть следующий (безобразный) HTML:

<p id="foo">
    <span>hello</span>
    <div>world</div>
</p>

И я беру нужный мне узел так:

var myNode = document.getElementById("foo");

Как я могу удалить детей из foo, чтобы осталось только <p id="foo"></p>? 1011 *

Могу я просто сделать:

myNode.childNodes = new Array();

или я должен использовать какую-то комбинацию removeElement?

Я бы хотел, чтобы ответ был прямым DOM; хотя дополнительные баллы, если вы также предоставите ответ в jQuery вместе с ответом только для DOM.

Ответы [ 27 ]

3 голосов
/ 03 февраля 2014

я видел, как люди делают:

while (el.firstNode) {
    el.removeChild(el.firstNode);
}

тогда кто-то сказал, что el.lastNode быстрее

однако я думаю, что это самый быстрый:

var children = el.childNodes;
for (var i=children.length - 1; i>-1; i--) {
    el.removeNode(children[i]);
}

что вы думаете?

ps: эта тема спасла меня.мой аддон Firefox был отклонен, потому что я использовал innerHTML.Это стало привычкой в ​​течение длительного времени.тогда я осуждаю это.и я на самом деле заметил разницу в скорости.при загрузке innerhtml потребовалось некоторое время, чтобы обновиться, однако, добавив addElement, он мгновенно!

3 голосов
/ 01 февраля 2014
var empty_element = function (element) {

    var node = element;

    while (element.hasChildNodes()) {              // selected elem has children

        if (node.hasChildNodes()) {                // current node has children
            node = node.lastChild;                 // set current node to child
        }
        else {                                     // last child found
            console.log(node.nodeName);
            node = node.parentNode;                // set node to parent
            node.removeChild(node.lastChild);      // remove last node
        }
    }
}

Это удалит все узлы в элементе.

3 голосов
/ 27 января 2017

Для этого есть несколько вариантов:

Самый быстрый ():

while (node.lastChild) {
  node.removeChild(node.lastChild);
}

Альтернативы (медленнее):

while (node.firstChild) {
  node.removeChild(node.firstChild);
}

while (node.hasChildNodes()) {
  node.removeChild(node.lastChild);
}

Тестс предложенными опциями

2 голосов
/ 27 января 2014

innerText - победитель! http://jsperf.com/innerhtml-vs-removechild/133. Во всех предыдущих тестах внутренний dom родительского узла удалялся на первой итерации, а затем innerHTML или removeChild, где применялся к пустому div.

2 голосов
/ 06 декабря 2018

Использование цикла диапазона кажется мне наиболее естественным:

for (var child of node.childNodes) {
    child.remove();
}

Согласно моим измерениям в Chrome и Firefox, он примерно в 1,3 раза медленнее. В обычных обстоятельствах это, возможно, не будет иметь значения.

2 голосов
/ 18 июля 2016

Самый простой способ удаления дочерних узлов узла с помощью Javascript

var myNode = document.getElementById("foo");
while(myNode.hasChildNodes())
{
   myNode.removeChild(myNode.lastChild);
}
2 голосов
/ 09 сентября 2018

Вот что я обычно делаю:

HTMLElement.prototype.empty = function() {
    while (this.firstChild) {
        this.removeChild(this.firstChild);
    }
}

И вуаля, позже вы можете очистить любой элемент dom с помощью:

anyDom.empty()
1 голос
/ 14 июля 2017

Как правило, JavaScript использует массивы для ссылки на списки узлов DOM.Таким образом, это будет хорошо работать, если вы заинтересованы в этом через массив HTMLElements.Кроме того, стоит отметить, поскольку я использую ссылку на массив вместо прототипа JavaScript, это должно работать в любом браузере, включая IE.

while(nodeArray.length !== 0) {
  nodeArray[0].parentNode.removeChild(nodeArray[0]);
}
0 голосов
/ 15 ноября 2018

Просто видел, как кто-то упоминал этот вопрос в другом, и думал, что я добавлю метод, которого я еще не видел:

function clear(el) {
    el.parentNode.replaceChild(el.cloneNode(false), el);
}

var myNode = document.getElementById("foo");
clear(myNode);

Функция clear берет элемент и использует родительский узел, чтобы заменить себя копией без дочерних элементов. Небольшой выигрыш в производительности, если элемент разреженный, но когда элемент имеет несколько узлов, выигрыш в производительности реализуется.

0 голосов
/ 18 августа 2018

простое и быстрое использование для цикла !!

var myNode = document.getElementById("foo");

    for(var i = myNode.childNodes.length - 1; i >= 0; --i) {
      myNode.removeChild(myNode.childNodes[i]);
    }

это не будет работать в теге <span>!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...