Entfernen Sie alle untergeordneten Elemente eines DOM-Knotens in JavaScript


873

Wie würde ich vorgehen, um alle untergeordneten Elemente eines DOM-Knotens in JavaScript zu entfernen?

Angenommen, ich habe den folgenden (hässlichen) HTML-Code:

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

Und ich greife nach dem Knoten, den ich möchte:

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

Wie könnte ich die Kinder entfernen, foodamit nur <p id="foo"></p>noch übrig bleibt?

Könnte ich einfach tun:

myNode.childNodes = new Array();

oder sollte ich eine Kombination von verwenden removeElement?

Ich möchte, dass die Antwort direkt bei DOM ist. Allerdings zusätzliche Punkte, wenn Sie in jQuery zusammen mit der Nur-DOM-Antwort auch eine Antwort angeben.

Antworten:


1674

Option 1 A: Löschen innerHTML.

  • Dieser Ansatz ist einfach, eignet sich jedoch möglicherweise nicht für Hochleistungsanwendungen, da er den HTML-Parser des Browsers aufruft (obwohl Browser möglicherweise für den Fall optimieren, dass der Wert eine leere Zeichenfolge ist).

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  myNode.innerHTML = '';
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via innerHTML</button>

Option 1 B: Löschen textContent

  • Wie oben, aber verwenden .textContent. Laut MDN ist dies schneller als innerHTMLwenn Browser ihre HTML-Parser nicht aufrufen und stattdessen sofort alle untergeordneten Elemente des Elements durch einen einzelnen #textKnoten ersetzen .

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  myNode.textContent = '';
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via textContent</button>

Option 2 A: Schleifen, um alle zu entfernen lastChild:

  • Eine frühere Bearbeitung dieser Antwort wurde verwendet firstChild, diese wird jedoch aktualisiert, um sie lastChildwie in der Informatik zu verwenden. Im Allgemeinen ist das Entfernen des letzten Elements einer Sammlung erheblich schneller als das Entfernen des ersten Elements (abhängig davon, wie die Sammlung implementiert ist ).
  • Die Schleife prüft weiter, firstChild nur für den Fall, dass die Suche schneller ist firstChildals lastChild(z. B. wenn die Elementliste von der UA als gerichtete verknüpfte Liste implementiert ist).

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  while (myNode.firstChild) {
    myNode.removeChild(myNode.lastChild);
  }
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via lastChild-loop</button>

Option 2 B: Schleifen, um alle zu entfernen lastElementChild:

  • Dieser Ansatz bewahrt alle Nicht- Element(nämlich #textKnoten und <!-- comments -->) untergeordneten Elemente des übergeordneten Elements (jedoch nicht dessen Nachkommen) - und dies kann in Ihrer Anwendung wünschenswert sein (z. B. einige Vorlagen-Systeme, die Inline-HTML-Kommentare zum Speichern von Vorlagenanweisungen verwenden).
  • Dieser Ansatz wurde erst in den letzten Jahren verwendet, da Internet Explorer nur die Unterstützung für lastElementChildIE9 hinzufügte .

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  while (myNode.lastElementChild) {
    myNode.removeChild(myNode.lastElementChild);
  }
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <!-- This comment won't be removed -->
  <span>Hello <!-- This comment WILL be removed --></span>
  <!-- But this one won't. -->
</div>
<button id='doFoo'>Remove via lastElementChild-loop</button>

Bonus: Element.clearChildrenAffenpflaster:

  • Wir können dem ElementPrototyp in JavaScript eine neue Methodeneigenschaft hinzufügen , um das Aufrufen auf nur zu vereinfachen el.clearChildren()(wo elsich ein HTML-Elementobjekt befindet).
  • (Genau genommen handelt es sich hierbei um ein Affen-Patch, nicht um eine Polyfüllung, da dies keine Standard-DOM-Funktion oder fehlende Funktion ist. Beachten Sie, dass das Patchen von Affen in vielen Situationen zu Recht nicht empfohlen wird.)

if( typeof Element.prototype.clearChildren === 'undefined' ) {
    Object.defineProperty(Element.prototype, 'clearChildren', {
      configurable: true,
      enumerable: false,
      value: function() {
        while(this.firstChild) this.removeChild(this.lastChild);
      }
    });
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello <!-- This comment WILL be removed --></span>
</div>
<button onclick="this.previousElementSibling.clearChildren()">Remove via monkey-patch</button>


6
In jQuery können diese beiden Probleme berücksichtigt werden: Diese Methode entfernt nicht nur untergeordnete (und andere untergeordnete) Elemente, sondern auch Text innerhalb des Satzes übereinstimmender Elemente. Dies liegt daran, dass gemäß der DOM-Spezifikation jede Textzeichenfolge innerhalb eines Elements als untergeordneter Knoten dieses Elements betrachtet wird. UND "Um Speicherlecks zu vermeiden, entfernt jQuery andere Konstrukte wie Daten- und Ereignishandler aus den untergeordneten Elementen, bevor die Elemente selbst entfernt werden."
Jottos

104
Übrigens scheint die Verwendung von lastChild etwas effektiver zu sein. Jsperf.com/innerhtml-vs-removechild/15
Andrey Lushnikov

24
innerHTML funktioniert nur, wenn Sie sich nur mit HTML beschäftigen. Wenn zB nur SVG drin ist, funktioniert die Elemententfernung
stwissel

34
NIEMALS NIEMALS NIEMALS innerHTML = '' verwenden. Tu es nicht. Das Problem ist, dass die Elemente so aussehen, als wären sie entfernt, aber intern bleiben die Knoten bestehen und verlangsamen die Dinge. Sie müssen alle einzelnen Knoten aus einem bestimmten Grund entfernen. Getestet in Google Chrome und IE. Bitte ziehen Sie in Betracht, die innerHTML "Lösung" zu entfernen, da dies falsch ist.
Kenji

15
@vsync Ich glaube nicht, dass Kenjis Kommentar begründet ist. Das Tun innerHTML = ''ist langsamer, aber ich denke nicht, dass es "falsch" ist. Alle Behauptungen von Speicherlecks sollten mit Beweisen belegt werden.
Chris Middleton

115

Die derzeit akzeptierte Antwort ist falsch, innerHTMLweil sie langsamer ist (zumindest in IE und Chrome), wie m93a richtig erwähnt.

Chrome und FF sind mit dieser Methode erheblich schneller (wodurch angehängte Abfragedaten zerstört werden):

var cNode = node.cloneNode(false);
node.parentNode.replaceChild(cNode, node);

in einer fernen Sekunde für FF und Chrome und am schnellsten im IE:

node.innerHTML = '';

InnerHTML zerstört Ihre Event-Handler nicht und bricht keine JQuery-Referenzen . Es wird auch als Lösung hier empfohlen: https://developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML .

Die schnellste DOM-Manipulationsmethode (immer noch langsamer als die beiden vorherigen) ist das Entfernen von Bereichen. Bereiche werden jedoch erst in IE9 unterstützt.

var range = document.createRange();
range.selectNodeContents(node);
range.deleteContents();

Die anderen genannten Methoden scheinen vergleichbar zu sein, aber viel langsamer als innerHTML, mit Ausnahme des Ausreißers jquery (1.1.1 und 3.1.1), der erheblich langsamer ist als alles andere:

$(node).empty();

Beweis hier:

http://jsperf.com/innerhtml-vs-removechild/167 http://jsperf.com/innerhtml-vs-removechild/300 https://jsperf.com/remove-all-child-elements-of-a- dom-node-in-javascript (Neue URL für den Neustart von jsperf, da das Bearbeiten der alten URL nicht funktioniert)

Jsperfs "Per-Test-Loop" wird oft als "Per-Iteration" verstanden, und nur bei der ersten Iteration müssen Knoten entfernt werden, sodass die Ergebnisse bedeutungslos sind. Zum Zeitpunkt der Veröffentlichung waren Tests in diesem Thread falsch eingerichtet.


2
Dein jsperf ist komplett kaputt. Das ist kein sehr guter Beweis.
Bryc

4
Dies ist derzeit die beste Antwort. Alles andere in diesem Thread ist Desinformation (!). Danke, dass du all diese schlechten alten Tests aufgeräumt hast.
Ben

6
"InnerHTML wird Ihre Ereignishandler nicht zerstören oder JQuery-Referenzen durcheinander bringen." Es werden verwaiste Daten verwaist jQuery.cache, was zu einem Speicherverlust führt, da die einzige verfügbare Referenz zum Verwalten dieser Daten auf den gerade zerstörten Elementen war.

1
"InnerHTML wird Ihre Ereignishandler nicht zerstören oder JQuery-Referenzen durcheinander bringen" bezieht sich auf den Container, nicht auf die untergeordneten Elemente. cloneNodeschaltet den Container aus, was bedeutet, dass Verweise auf den Container nicht gepflegt werden (jquery oder anderweitig). Im Cache von Jquery kann es sich lohnen, jquery zum Entfernen von Elementen zu verwenden, wenn Sie an jquery-Daten angehängt sind. Hoffentlich wechseln sie irgendwann zu WeakMaps . Das Bereinigen (oder sogar das Vorhandensein) des $ .cache scheint nicht offiziell dokumentiert zu sein.
Npjohns

10
Die jsperf-Tests sind hier kaputt. Die Test-Engine meldet Folgendes: "Fehler: Dom-Knoten wurden während der Iterationen nicht neu erstellt. Die Testergebnisse sind bedeutungslos."
senderle

73

Verwenden Sie modernes Javascript mit remove!

const parent = document.getElementById("foo");
while (parent.firstChild) {
    parent.firstChild.remove();
}

Dies ist eine neuere Methode zum Schreiben der Knotenentfernung in ES5. Es ist Vanilla JS und liest sich viel besser als frühere Versionen.

Die meisten Benutzer sollten über moderne Browser verfügen, oder Sie können bei Bedarf nach unten transpilieren.

Browser-Unterstützung - 95% Dezember 2019


14
Die for-Schleife funktioniert nicht, da parent.children / parent.childNodes Live-Listen sind. Wenn Sie remove aufrufen, wird die Liste geändert, und es ist nicht garantiert, dass Ihr Iterator über alles iteriert. In Chrome überspringen Sie beispielsweise jeden anderen Knoten. Verwenden Sie besser eine while (parent.firstChild) { parent.removeChild(parent.firstChild); }Schleife. developer.mozilla.org/en-US/docs/Web/API/ParentNode/children developer.mozilla.org/en-US/docs/Web/API/Node/childNodes
qix

3
Coole Kurzschrift, obwohl weniger lesbar:while (parent.firstChild && !parent.firstChild.remove());
Gibolt

1
Ein [...parent.childNodes].forEach(el => el.remove());

1
Dies funktioniert nicht in Typescript ... stattdessen verwendenwhile (selectElem.firstElementChild) { selectElem.firstElementChild.remove(); }
John Henckel

43
var myNode = document.getElementById("foo");
var fc = myNode.firstChild;

while( fc ) {
    myNode.removeChild( fc );
    fc = myNode.firstChild;
}

Wenn die Möglichkeit besteht, dass Nachkommen von jQuery betroffen sind, müssen Sie eine Methode verwenden, mit der jQuery-Daten bereinigt werden.

$('#foo').empty();

Die jQuery- .empty()Methode stellt sicher, dass alle Daten, die jQuery mit zu entfernenden Elementen verknüpft, bereinigt werden.

Wenn Sie einfach DOMMethoden zum Entfernen der untergeordneten Elemente verwenden, bleiben diese Daten erhalten.


Die innerHTML-Methode ist bei weitem die performanteste. Das heißt, die Daten werden von .empty () von jquery bereinigt: Eliminiert die Daten () in jquery, die den untergeordneten Tags zugeordnet sind, mithilfe einer rekursiven Schleife (langsam, kann jedoch die Speichernutzung erheblich reduzieren). Verhindert Speicherlecks, wenn Sie Ereignisse ohne angehängt haben jquery, wie mit .onclick = .... Wenn Sie keine derartigen Ereignisse in den zu entfernenden Kindern haben, wird das Festlegen von innerHTML nicht auslaufen. Die beste Antwort ist also - es kommt darauf an.
Chris Moschini

1
Warum nicht einfach den firstChild-Ausdruck direkt in den Zustand der while-Schleife setzen? while ( myNode.firstChild ) {
Victor Zamanian

while(fc = myNode.firstChild){ myNode.removeChild(fc); }
Valen

36

Wenn Sie jQuery verwenden:

$('#foo').empty();

Wenn Sie nicht:

var foo = document.getElementById('foo');
while (foo.firstChild) foo.removeChild(foo.firstChild);

20

Das schnellste...

var removeChilds = function (node) {
    var last;
    while (last = node.lastChild) node.removeChild(last);
};

Vielen Dank an Andrey Lushnikov für seinen Link zu jsperf.com (coole Seite!).

BEARBEITEN: Um klar zu sein, gibt es in Chrome keinen Leistungsunterschied zwischen firstChild und lastChild. Die Top-Antwort zeigt eine gute Lösung für die Leistung.


Gleiches ohne LINT-Warnung: clear: function (container) {for (;;) {var child = container.lastChild; wenn (! Kind) brechen; container.removeChild (Kind); }}
cskwg

9

Wenn Sie den Knoten nur ohne seine untergeordneten Knoten haben möchten, können Sie auch eine Kopie davon erstellen:

var dupNode = document.getElementById("foo").cloneNode(false);

Kommt darauf an, was du erreichen willst.


3
Vielleicht könnten Sie dem sogar folgen parent.replaceChild(cloned, original)? Das ist möglicherweise schneller als das Entfernen von untergeordneten Elementen nacheinander und sollte für alles funktionieren, was das DOM unterstützt (also für alle Arten von XML-Dokumenten, einschließlich SVG). Das Festlegen von innerHTML ist möglicherweise auch schneller als das Entfernen von untergeordneten Elementen nacheinander. Dies funktioniert jedoch nur für HTML-Dokumente. Sollte das mal testen.
Maarten

13
Das kopiert keine Ereignis-Listener, die mit hinzugefügt wurden addEventListener.
Matthew

Wenn Sie mit dieser Einschränkung leben können, ist es sicherlich schnell: jsperf.com/innerhtml-vs-removechild/137
DanMan

7

Hier ist ein anderer Ansatz:

function removeAllChildren(theParent){

    // Create the Range object
    var rangeObj = new Range();

    // Select all of theParent's children
    rangeObj.selectNodeContents(theParent);

    // Delete everything that is selected
    rangeObj.deleteContents();
}

1
Dies ist interessant, aber es scheint ziemlich langsam im Vergleich zu anderen Methoden: jsperf.com/innerhtml-vs-removechild/256
Polaris878

6
element.textContent = '';

Es ist wie innerText, außer Standard. Es ist etwas langsamer als removeChild(), aber es ist einfacher zu verwenden und macht keinen großen Leistungsunterschied, wenn Sie nicht zu viel Material zum Löschen haben.


Ein
Textknoten

Entschuldigung, Sie haben Recht, es entfernt in der Tat alle
untergeordneten

Dies funktioniert in älteren Versionen von Internet Explorer nicht.
pwdst

4

Als Antwort auf DanMan, Maarten und Matt. Das Klonen eines Knotens, um den Text festzulegen, ist in der Tat ein praktikabler Weg für meine Ergebnisse.

// @param {node} node
// @return {node} empty node
function removeAllChildrenFromNode (node) {
  var shell;
  // do not copy the contents
  shell = node.cloneNode(false);

  if (node.parentNode) {
    node.parentNode.replaceChild(shell, node);
  }

  return shell;
}

// use as such
var myNode = document.getElementById('foo');
myNode = removeAllChildrenFromNode( myNode );

Dies funktioniert auch für Knoten, die sich nicht im Dom befinden und beim Versuch, auf den parentNode zuzugreifen, null zurückgeben. Wenn Sie sicher sein müssen, dass ein Knoten leer ist, bevor Sie Inhalte hinzufügen, ist dies sehr hilfreich. Betrachten Sie den Anwendungsfall darunter.

// @param {node} node
// @param {string|html} content
// @return {node} node with content only
function refreshContent (node, content) {
  var shell;
  // do not copy the contents
  shell = node.cloneNode(false);

  // use innerHTML or you preffered method
  // depending on what you need
  shell.innerHTML( content );

  if (node.parentNode) {
    node.parentNode.replaceChild(shell, node);
  }

  return shell;
}

// use as such
var myNode = document.getElementById('foo');
myNode = refreshContent( myNode );

Ich finde diese Methode sehr nützlich, wenn Sie eine Zeichenfolge innerhalb eines Elements ersetzen. Wenn Sie nicht sicher sind, was der Knoten enthalten soll, anstatt sich Gedanken darüber zu machen, wie das Chaos beseitigt werden soll, beginnen Sie neu.


3
das Schlimmste überhaupt. Wenn Sie den ursprünglichen Knoten durch seinen Klon ersetzen, verlieren Sie den Verweis auf den ursprünglichen Knoten. Keiner der Ereignishandler und andere Bindungen funktioniert nicht.
Arun Aravind

4

Folgendes mache ich normalerweise:

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

Und voila, später können Sie jedes dom-Element leeren mit:

anyDom.empty()

Ich mag diese Lösung! Gibt es einen Grund, warum ich innerHTML auf eine leere Zeichenfolge setzen sollte?
TheCodenator

Leistung: domEl.innerHTML = ""ist schlecht und gilt als schlechte Praxis
Ado Ren

3

Dafür gibt es mehrere Möglichkeiten:

Das schnellste ():

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

Alternativen (langsamer):

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

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

Benchmark mit den vorgeschlagenen Optionen


3
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
        }
    }
}

Dadurch werden alle Knoten innerhalb des Elements entfernt.


... weil es unnötig komplex ist und keine Erklärung dafür gegeben wird, wie es funktioniert (was eigentlich nicht offensichtlich ist), vermute ich.
Periata Breatta

2

innerText ist der Gewinner! http://jsperf.com/innerhtml-vs-removechild/133 . Bei allen vorherigen Tests wurde der innere Dom des übergeordneten Knotens bei der ersten Iteration gelöscht und dann innerHTML oder removeChild auf leeres div angewendet.


5
innerTextist jedoch eine proprietäre MS-Sache. Ich sage nur.
DanMan

1
Ich boxbin mir ziemlich sicher, dass dies ein fehlerhafter Test ist - er hängt davon ab, dass er nicht als Variable, sondern über die DOM-Suche basierend auf der ID verfügbar ist, und da die whileSchleife diesen langsamen Aufruf viele Male ausführt, wird er bestraft.
Nrabinowitz

2

Einfachste Möglichkeit, die untergeordneten Knoten eines Knotens über Javascript zu entfernen

var myNode = document.getElementById("foo");
while(myNode.hasChildNodes())
{
   myNode.removeChild(myNode.lastChild);
}

2

Ich sah Leute tun:

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

dann sagte jemand, dass die Verwendung el.lastNodeschneller ist

Ich würde jedoch denken, dass dies das schnellste ist:

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

Was denken Sie?

ps: dieses thema hat mir das leben gerettet. Mein Firefox-Addon wurde abgelehnt, weil ich innerHTML verwendet habe. Es ist schon lange eine Gewohnheit. dann foudn ich das. und ich bemerkte tatsächlich einen Geschwindigkeitsunterschied. Beim Laden dauerte es eine Weile, bis der innerhtml aktualisiert wurde, jedoch wurde addElement sofort ausgeführt!


1
Nun, ich denke, ob es am schnellsten ist oder nicht, einige JSperf-Tests können beide Fälle beweisen
Nikos M.

Super Arbeit, danke für diese Tests. Sie schließen den for (var i=0...einen jedoch nicht ein. Aber hier ist, was ich bekam, als ich diese Tests durchführte: i.imgur.com/Mn61AmI.png In diesen drei Tests war firstNode schneller als lastNode und innerHTML, was wirklich cool ist
Noitidart

Ich habe die Tests hinzugefügt: jsperf.com/innerhtml-vs-removechild/220 Interessantes, was die el.firstNode-Methode macht, ist der schnellste Weg, wie es scheint
Noitidart

2

Die Verwendung einer Bereichsschleife fühlt sich für mich am natürlichsten an:

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

Nach meinen Messungen in Chrome und Firefox ist es ungefähr 1,3x langsamer. Unter normalen Umständen spielt dies möglicherweise keine Rolle.


2
 let el = document.querySelector('#el');
 if (el.hasChildNodes()) {
      el.childNodes.forEach(child => el.removeChild(child));
 }

1
Bitte erläutern Sie als Antwort, was Ihr Code tut.
Nirav Joshi

1
Es ist selbsterklärend
Schwarzschaf

1

Im Allgemeinen verwendet JavaScript Arrays, um Listen von DOM-Knoten zu referenzieren. Dies funktioniert also gut, wenn Sie Interesse daran haben, dies über das HTMLElements-Array zu tun. Erwähnenswert ist auch, dass ich in jedem Browser, einschließlich IE, funktionieren sollte, da ich anstelle von JavaScript-Proto eine Array-Referenz verwende.

while(nodeArray.length !== 0) {
  nodeArray[0].parentNode.removeChild(nodeArray[0]);
}

1

Warum folgen wir hier nicht der einfachsten Methode?

const foo = document.querySelector(".foo");
while (foo.firstChild) {
  foo.firstChild.remove();     
}
  • Auswahl des übergeordneten Div
  • Verwenden der "remove" -Methode in einer While-Schleife zum Entfernen des ersten untergeordneten Elements, bis kein Element mehr vorhanden ist.

Bitte erläutern Sie Ihre Codezeilen, damit andere Benutzer die Funktionalität verstehen können. Vielen Dank!
Ignacio Ara

@IgnacioAra Fertig!
Neelansh Verma

1

Ich habe gerade gesehen, wie jemand diese Frage in einer anderen erwähnte und dachte, ich würde eine Methode hinzufügen, die ich noch nicht gesehen habe:

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

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

Die Löschfunktion nimmt das Element und verwendet den übergeordneten Knoten, um sich durch eine Kopie ohne untergeordnete Elemente zu ersetzen. Nicht viel Leistungsgewinn, wenn das Element dünn ist, aber wenn das Element eine Reihe von Knoten hat, werden die Leistungsgewinne realisiert.


1
Eigentlich scheint es hier erwähnt worden zu sein stackoverflow.com/a/15441725/576767
Félix Gagnon-Grenier

Felix, das muss ich verpasst haben, danke für die Korrektur +1.
Harry Chilinguerian

1

Nur funktionaler Ansatz:

const domChildren = (el) => Array.from(el.childNodes)
const domRemove = (el) => el.parentNode.removeChild(el)
const domEmpty = (el) => domChildren(el).map(domRemove)

"childNodes" in domChildren gibt eine Knotenliste der unmittelbaren untergeordneten Elemente an, die leer ist, wenn keine gefunden werden. Um die Knotenliste zuzuordnen, konvertiert domChildren sie in ein Array. domEmpty ordnet eine Funktion domRemove allen Elementen zu, die sie entfernen.

Anwendungsbeispiel:

domEmpty(document.body)

Entfernt alle Kinder aus dem Körperelement.


0

Andere Möglichkeiten in jQuery

var foo = $("#foo");
foo.children().remove();
//or
$("*", foo ).remove();
//or
foo.html("");
//or
foo.empty();

Down-Voting, da OP sagte, dass Antworten in direktem DOM bevorzugt werden.
Bwindels

Auch jQuery hat .empty()Methode, $("#foo").empty()wäre einfach genug
YakovL

-1

einfach nur IE:

parentElement.removeNode(true);

true - bedeutet eine tiefe Entfernung - was bedeutet, dass auch alle Kinder entfernt werden


1
IE? Das ist das 21. Jahrhundert!
everlasto

-1

Der einfachste Weg:

let container = document.getElementById("containerId");
container.innerHTML = "";

Achten Sie dabei darauf container.innerHTML = null, dass Internet Explorer den Text anzeigt null. Das entfernt die Kinder also nicht wirklich, würde ich sagen.
Arjan

-1

einfach und schnell mit for loop !!

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

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

Dies wird nicht im <span>Tag funktionieren !


in vor allem Lösung entfernt kein Code <span>Tag
Mohit Karkar

-3

Wenn Sie etwas zurückbringen möchten div, innerHTMList das wahrscheinlich besser.

Mein Beispiel:

<ul><div id="result"></div></ul>

<script>
  function displayHTML(result){
    var movieLink = document.createElement("li");
    var t = document.createTextNode(result.Title);
    movieLink.appendChild(t);
    outputDiv.appendChild(movieLink);
  }
</script>

Wenn ich die Methode .firstChildoder .lastChildverwende, displayHTML()funktioniert die Funktion danach nicht mehr, aber kein Problem mit der .innerHTMLMethode.


-4

Dies ist ein reines Javascript, das ich nicht mit jQuery verwende, aber es funktioniert in allen Browsern, auch im IE, und es ist sehr einfach zu verstehen

   <div id="my_div">
    <p>Paragraph one</p>
    <p>Paragraph two</p>
    <p>Paragraph three</p>
   </div>
   <button id ="my_button>Remove nodes ?</button>

   document.getElementById("my_button").addEventListener("click",function(){

  let parent_node =document.getElemetById("my_div"); //Div which contains paagraphs

  //Let find numbers of child inside the div then remove all
  for(var i =0; i < parent_node.childNodes.length; i++) {
     //To avoid a problem which may happen if there is no childNodes[i] 
     try{
       if(parent_node.childNodes[i]){
         parent_node.removeChild(parent_node.childNodes[i]);
       }
     }catch(e){
     }
  }

})

or you may simpli do this which is a quick way to do

document.getElementById("my_button").addEventListener("click",function(){

 let parent_node =document.getElemetById("my_div");
 parent_node.innerHTML ="";

})

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.