Element durch ID entfernen

1129

Wenn Sie ein Element mit Standard-JavaScript entfernen, müssen Sie zuerst zu seinem übergeordneten Element wechseln:

var element = document.getElementById("element-id");
element.parentNode.removeChild(element);

Es scheint mir etwas seltsam, zuerst zum übergeordneten Knoten gehen zu müssen. Gibt es einen Grund, warum JavaScript so funktioniert?

Zaz
quelle
534
Wie James sagte, unterstützt das DOM das direkte Entfernen eines Objekts nicht. Sie müssen zu seinem Elternteil gehen und es von dort entfernen. Javascript lässt kein Element Selbstmord begehen, aber es erlaubt Kindsmord ...
Mark Henderson
21
Gibt es einen Grund? Richard Feynman sagt nein . (Nun, die technische Begründung ist leicht zu erkennen, ob Sie Baumstrukturprogramme geschrieben haben. Das Kind muss den Elternteil trotzdem informieren, da sonst die Baumstruktur beschädigt werden kann. Da dies ohnehin intern erfolgen muss, wenn es Ihnen eine einzeilige Funktion bietet , es ist nur eine bequeme Funktion für Sie, die Sie auch selbst definieren können.)
kizzx2
6
Der einzige Grund, den ich sehe, ist, dass es immer ein Stammelement in einem xml / xhtml-Dokument geben sollte, so dass Sie es nicht entfernen können, weil es kein übergeordnetes Element hat
Alex K
5
Ich mag Johans Problemumgehung sehr und bin mir nicht sicher, warum diese Funktionen nicht nativ bereitgestellt werden. Wie die Anzahl der Zuschauer zeigt, handelt es sich um eine sehr häufige Operation.
Zaz
12
Sie können element.remove()direkt ab ES5 verwenden. Du brauchst die Eltern nicht!
Gibolt

Antworten:

659

Ich weiß, dass das Erweitern nativer DOM-Funktionen nicht immer die beste oder beliebteste Lösung ist, aber dies funktioniert gut für moderne Browser.

Element.prototype.remove = function() {
    this.parentElement.removeChild(this);
}
NodeList.prototype.remove = HTMLCollection.prototype.remove = function() {
    for(var i = this.length - 1; i >= 0; i--) {
        if(this[i] && this[i].parentElement) {
            this[i].parentElement.removeChild(this[i]);
        }
    }
}

Und dann können Sie solche Elemente entfernen

document.getElementById("my-element").remove();

oder

document.getElementsByClassName("my-elements").remove();

Hinweis: Diese Lösung funktioniert nicht für IE 7 und niedriger. Weitere Informationen zum Erweitern des DOM finden Sie in diesem Artikel .

EDIT : Überprüfung meiner Antwort im Jahr 2019, node.remove()ist zur Rettung gekommen und kann wie folgt verwendet werden (ohne die Polyfill oben):

document.getElementById("my-element").remove();

oder

[...document.getElementsByClassName("my-elements")].map(n => n && n.remove());

Diese Funktionen sind in allen modernen Browsern (nicht im Internet Explorer) verfügbar. Lesen Sie mehr über MDN .

Johan Dettmar
quelle
3
Sollte es nicht [document.getElementsByClassName ("my-elements") [0] .remove () sein; ] Ich denke, die Funktion remove () wird nicht von Arrays implementiert. Um alle Elemente einer Klasse oder eines Selektors zu entfernen, der ein Array zurückgibt, müssen Sie alle Elemente durchlaufen und für jedes Element remove () aufrufen.
Sedat Kilinc
1
@SedatKilinc, hast du das eigentliche Snippet ausprobiert? Es sind keine Arrays beteiligt, sondern NodeListoder HTMLCollectionwelche Array-ähnliche Reihe von Elementen. Die zweite Methodendefinition ermöglicht das Entfernen dieser "Elementsätze".
Johan Dettmar
1
Wenn Sie dies in der Chrome-Konsole ausführen, wird bei der Verwendung immer nur ein Element gelöscht document.getElementsByClassName("my-elements").remove();. Bearbeiten: Tatsächlich wird ein Haufen gelöscht, es muss jedoch erneut ausgeführt werden, um den Vorgang abzuschließen. Versuchen Sie es auf dieser Seite mit der Klasse "Kommentar-Kopie".
DanielST
2
@ Slicedtoad du hast recht, mein schlechtes. Ich habe die Funktion so geändert, dass sie die Elemente rückwärts durchläuft. Scheint gut zu funktionieren. Das Verhalten, über das Sie sprechen, wird höchstwahrscheinlich durch aktualisierte Indizes verursacht.
Johan Dettmar
1
Tu das nicht. Entfernen Sie Elemente einfach so, wie es die Sprache beabsichtigt. Jeder, der mit dem Parsen von XML vertraut ist, erkennt die Notwendigkeit, zum übergeordneten Element zu gelangen, um untergeordnete Elemente zu löschen. HTML ist eine Obermenge von XML.
Hal50000
283

Crossbrowser und IE> = 11:

document.getElementById("element-id").outerHTML = "";
user2192293
quelle
3
Dies scheint die einfachste, zuverlässigste und schnellste Lösung zu sein. Ich muss das Element nicht löschen, damit ich die letzte Zeile überspringe, aber das sollte keinen Overhead verursachen. Hinweis : Ich habe dies gefunden, als ich versucht habe, eine $.readyAlternative zu noscriptTags zu finden, die schneller als js ist . Um es so zu verwenden, wie ich es wollte, musste ich es in eine 1-ms- setTimeoutFunktion einwickeln . Dies löst alle meine Probleme auf einmal. Gracias.
dgo
Denken Sie daran, outerHTMList immer noch eine neue (er) Ergänzung zum Standard. Wenn Sie zum Zeitpunkt des Schreibens Unterstützung für Software> 6 suchen, benötigen Sie eine andere Lösung. Die removevon anderen erwähnte Funktion ist ein ähnlicher Fall. Wie üblich ist es sicher, eine Polyfüllung zu implementieren.
Super Cat
delete elementtut nichts, da Sie keine Variablen in JS löschen können, nur Schlüssel;) Überprüfen Sie selbst, console.log(element)delete element
ob es
2
Dies ist etwas langsamer als removeChild(ca. 6-7% auf meinem System). Siehe jsperf.com/clear-outerhtml-v-removechild/2
Alejandro García Iglesias
1
Dies kann einen Bereich hinterlassen, in dem sich früher ein Iframe befand, wenn Sie versuchen, diesen zu entfernen.
Lacostenycoder
164

Sie könnten eine removeFunktion erstellen, damit Sie nicht jedes Mal darüber nachdenken müssen:

function removeElement(id) {
    var elem = document.getElementById(id);
    return elem.parentNode.removeChild(elem);
}
xsznix
quelle
12
Wenn Sie die Einzeiler ohne going global möchten, können Sie ändern elemzu remove.elem. Auf diese Weise verweist die Funktion auf sich selbst, sodass Sie keine weitere globale Variable erstellen müssen. :-)
Twiz
4
Also, warum musst du das Elem zurückgeben? Warum nichtfunction remove(id) { document.getElementById(id).parentNote.removeChild(document.getElementById(id)); }
Zach Lysobey
4
@ZachL: Ihre Lösung scheint zwar offensichtlicher zu sein, führt jedoch zwei langsamere DOM-Suchvorgänge durch, die die anderen Lösungen anscheinend vermeiden möchten.
Wk_of_Angmar
3
Funktioniert nicht. Zu viele Fehler. Dies funktioniert: var elem = document.getElementById ('id'); elem.parentNode.removeChild (elem);
Mitch Match
2
Wow, warum so kompliziert. Übergeben Sie einfach das Element selbst anstelle einer ID-Zeichenfolge an die Funktion. Auf diese Weise ist das Element in der gesamten Funktion zugänglich und es bleibt ein Einzeiler
David Fariña
97

Das unterstützt das DOM . Durchsuchen Sie diese Seite nach "entfernen" oder "löschen" und removeChild ist die einzige, die einen Knoten entfernt.

Christian Sirolli
quelle
13
Das beantwortet meine ursprüngliche Frage, aber warum funktioniert JavaScript so?
Zaz
5
Ich rate hier nur, aber ich würde annehmen, dass es mit Speicherverwaltung zu tun hat. Der übergeordnete Knoten enthält höchstwahrscheinlich eine Liste von Zeigern auf die untergeordneten Knoten. Wenn Sie gerade einen Knoten gelöscht haben (ohne übergeordnetes Element zu verwenden), hält das übergeordnete Element den Zeiger weiterhin und verursacht einen Speicherverlust. Die API zwingt Sie also, eine Funktion auf dem Elternteil aufzurufen, um das Kind zu löschen. Dies ist auch deshalb hilfreich, weil der Baum durch die untergeordneten Knoten laufen kann, die bei jedem von ihnen remove aufrufen, ohne dass Speicher verloren geht.
Chadams
2
Hey Leute, obwohl diese Referenz dies nicht hat, habe ich sie versehentlich gefunden. Schreiben element.remove();wird funktionieren. Vielleicht ist es etwas Neues. Aber zum ersten Mal für mich und es funktioniert. Ich denke, es hätte immer funktionieren sollen, da es sehr einfach ist.
Muhammad Umer
1
Aber es funktioniert nicht in IE7 und darunter. Von IE7 und darunter funktioniert remove () nicht
fanfan1609
1
Wenn ich raten müsste, funktioniert das so, weil DOM-Elemente sich nicht selbst entfernen können. Sie entfernen den sprichwörtlichen Teppich unter seinen Füßen. Sie müssen es aus dem Behälter entfernen. Zumindest versuche ich so darüber nachzudenken.
PhilT
82

Das DOM ist in einem Knotenbaum organisiert, in dem jeder Knoten einen Wert sowie eine Liste von Verweisen auf seine untergeordneten Knoten hat. Damitelement.parentNode.removeChild(element) ahmt genau das, was intern passiert: Zuerst gehen Sie das die übergeordnete Knoten, dann den Verweis auf den untergeordneten Knoten entfernen.

Ab DOM4 steht eine Hilfsfunktion zur Verfügung, um dasselbe zu tun : element.remove(). Dies funktioniert in 87% der Browser (Stand 2016), jedoch nicht in IE 11. Wenn Sie ältere Browser unterstützen müssen, können Sie:

Zaz
quelle
2
Bitte ändern Sie nicht die nativen DOM-Funktionen .
Emile Bergeron
36

Zum Entfernen eines Elements:

 var elem = document.getElementById("yourid");
 elem.parentElement.removeChild(elem);

Zum Entfernen aller Elemente mit beispielsweise einem bestimmten Klassennamen:

 var list = document.getElementsByClassName("yourclassname");
 for(var i = list.length - 1; 0 <= i; i--)
 if(list[i] && list[i].parentElement)
 list[i].parentElement.removeChild(list[i]);
csjpeter
quelle
Dies wird durch die vorhandenen Antworten gut abgedeckt.
KyleMit
4
+1 Für ein einfaches Beispiel zum Entfernen nach Klassennamen. Dies wird von den anderen Antworten nicht gut abgedeckt
Louise Eggleton
Warum ist die if(list[i] && list[i].parentElement)Leitung notwendig? Wird die Existenz jedes Elements nicht durch die Tatsache garantiert, dass es von der getElementsByClassNameMethode zurückgegeben wurde?
Hydrothermal
Leider ist die Existenz meines Wissens nicht wirklich garantiert, aber ich kenne die Details darüber nicht. Ich habe gerade einmal einen seltsamen undefinierten oder Nullwert erlebt und diesen Check dort ohne weitere Untersuchung abgelegt. Das ist also ein bisschen Hack.
Csjpeter
Es sollte seindocument.getElementsByClassName(...
Arbeiter
21

Sie können nur verwenden element.remove()

Sai Sunder
quelle
13
element.remove()ist kein gültiges JavaScript und funktioniert nur in bestimmten Browsern wie Chrome .
Zaz
4
Josh, es ist gültiges Javascript, außer dass nur Firefox und Chrome es implementiert haben (siehe MDN)
Tim Nguyen
10
Mein schlechtes, element.remove() ist gültiges JavaScript mit DOM4 und funktioniert in allen modernen Browsern, natürlich mit Ausnahme von Internet Explorer.
Zaz
24
Funktioniert gut mit FireFox und Chrome. Wer kümmert sich um IE
Arun Sharma
13
Menschen mit Jobs interessieren sich für IE!
sqram
18

Die ChildNode.remove()Methode entfernt das Objekt aus dem Baum, zu dem es gehört.

https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove

Hier ist eine Geige, die zeigt, wie Sie anrufen können document.getElementById('my-id').remove()

https://jsfiddle.net/52kp584L/

** **.

NodeList muss nicht erweitert werden. Es wurde bereits implementiert.

** **.

Alex Fallenstedt
quelle
2
Beachten Sie, dass dies in keiner Version von IE unterstützt wird!
MacroMan
1
Wenn Sie noch für IE entwickeln, tut mir das sehr leid.
Alex Fallenstedt
Sie entwickeln nicht für IE? Ihre Kunden oder Kunden tun mir sehr leid.
MacroMan
13

Sie können dieses Element mithilfe remove()der DOM-Methode direkt entfernen .

Hier ist ein Beispiel:

let subsWrapper = document.getElementById("element_id");
subsWrapper.remove();
//OR directly.
document.getElementById("element_id").remove();
Code-Kocher
quelle
7

Es scheint mir etwas seltsam, zuerst zum übergeordneten Knoten gehen zu müssen. Gibt es einen Grund, warum JavaScript so funktioniert?

Der Funktionsname lautet removeChild()und wie kann das Kind entfernt werden, wenn kein Elternteil vorhanden ist? :) :)

Andererseits müssen Sie es nicht immer so nennen, wie Sie es gezeigt haben. element.parentNodeist nur ein Helfer, um den übergeordneten Knoten des angegebenen Knotens abzurufen. Wenn Sie den übergeordneten Knoten bereits kennen, können Sie ihn einfach folgendermaßen verwenden:

Ex:

// Removing a specified element when knowing its parent node
var d = document.getElementById("top");
var d_nested = document.getElementById("nested");
var throwawayNode = d.removeChild(d_nested);

https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild

================================================== =======

Um noch etwas hinzuzufügen:

Einige Antworten haben darauf hingewiesen, dass Sie anstelle von verwenden parentNode.removeChild(child);könnenelem.remove(); . Aber wie ich bemerkt habe, gibt es einen Unterschied zwischen den beiden Funktionen, und er wird in diesen Antworten nicht erwähnt.

Wenn Sie verwenden removeChild(), wird ein Verweis auf den entfernten Knoten zurückgegeben.

var removedChild = element.parentNode.removeChild(element); 
console.log(removedChild); //will print the removed child.

Wenn Sie jedoch verwenden elem.remove();, wird die Referenz nicht zurückgegeben.

var el = document.getElementById('Example');
var removedChild = el.remove(); //undefined

https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove

Dieses Verhalten kann in Chrome und FF beobachtet werden. Ich glaube, es lohnt sich zu bemerken :)

Hoffe, meine Antwort fügt der Frage etwas Wert hinzu und wird hilfreich sein !!

Nimeshka Srimal
quelle
6

Funktionen, die ele.parentNode.removeChild (ele) verwenden, funktionieren nicht für Elemente, die Sie erstellt, aber noch nicht in den HTML-Code eingefügt haben. Bibliotheken wie jQuery und Prototype verwenden mit Bedacht eine Methode wie die folgende, um diese Einschränkung zu umgehen.

_limbo = document.createElement('div');
function deleteElement(ele){
    _limbo.appendChild(ele);
    _limbo.removeChild(ele);
}

Ich denke, JavaScript funktioniert so, weil die ursprünglichen Designer des DOM Eltern / Kind und vorherige / nächste Navigation als höhere Priorität angesehen haben als die heute so beliebten DHTML-Modifikationen. Mitte der 90er Jahre war es nützlich, von einem <input type = 'text'> lesen und nach relativer Position im DOM in einen anderen schreiben zu können. Damals war die dynamische Generierung ganzer HTML-Formulare oder interaktiver GUI-Elemente kaum ein Kinderspiel das Auge eines Entwicklers.

Psudo
quelle
3

Es scheint mir etwas seltsam, zuerst zum übergeordneten Knoten gehen zu müssen. Gibt es einen Grund, warum JavaScript so funktioniert?

IMHO: Der Grund dafür ist der gleiche wie in anderen Umgebungen: Sie führen eine Aktion aus, die auf Ihrem "Link" zu etwas basiert. Sie können es nicht löschen, während Sie damit verbunden sind.

Als würde man einen Ast schneiden. Setzen Sie sich beim Schneiden auf die Seite, die dem Baum am nächsten liegt, sonst ist das Ergebnis ... unglücklich (obwohl lustig).

TheSatinKnight
quelle
2

Dieser kommt tatsächlich von FireFox ... ausnahmsweise war IE dem Rudel voraus und erlaubte das direkte Entfernen eines Elements.

Dies ist nur meine Annahme, aber ich glaube, der Grund, warum Sie ein Kind über das Elternteil entfernen müssen, liegt in einem Problem mit der Art und Weise, wie FireFox mit der Referenz umgegangen ist.

Wenn Sie ein Objekt aufrufen, um Hari-Kari direkt festzuschreiben, behalten Sie diesen Verweis unmittelbar nach seinem Tod immer noch bei. Dies kann zu mehreren bösen Fehlern führen, z. B. wenn sie nicht entfernt werden, entfernt werden, aber Verweise darauf beibehalten werden, die als gültig erscheinen, oder einfach ein Speicherverlust.

Ich glaube, als sie das Problem erkannten, bestand die Problemumgehung darin, ein Element über das übergeordnete Element zu entfernen, da Sie jetzt, wenn das Element nicht mehr vorhanden ist, einfach einen Verweis auf das übergeordnete Element haben. Dies würde all diese Unannehmlichkeiten stoppen und (wenn zum Beispiel ein Baum Knoten für Knoten geschlossen wird) ziemlich gut "zip-up".

Es sollte ein leicht zu behebender Fehler sein, aber wie bei vielen anderen Dingen in der Webprogrammierung war die Veröffentlichung wahrscheinlich überstürzt, was dazu führte ... und als die nächste Version auf den Markt kam, verwendeten genug Leute sie, um dies zu ändern eine Menge Code zu brechen.

Auch dies alles ist einfach meine Vermutung.

Ich freue mich jedoch auf den Tag, an dem die Webprogrammierung endlich einen vollständigen Frühjahrsputz erhält, all diese seltsamen kleinen Eigenheiten aufgeräumt werden und alle nach den gleichen Regeln spielen.

Wahrscheinlich am Tag nachdem mein Roboterdiener mich wegen rückständiger Löhne verklagt hat.

SilentThunderStorm
quelle
10
Ich bezweifle, dass Firefox dafür verantwortlich ist. removeChildist eine Methode der DOM Level 1- NodeSchnittstelle .
Felix Kling
0

Soweit ich weiß, funktioniert das direkte Entfernen eines Knotens in Firefox nicht, sondern nur in Internet Explorer. Um Firefox zu unterstützen, müssen Sie zum übergeordneten Element gehen, um das untergeordnete Element zu entfernen.

Ref: http://chiragrdarji.wordpress.com/2007/03/16/removedelete-element-from-page-using-javascript-working-in-firefoxieopera/

James
quelle
6
Das beantwortet meine Frage nicht wirklich und die Seite, auf die Sie verlinkt haben, bietet eine schlechtere Lösung als meine.
Zaz
0
// http://javascript.crockford.com/memory/leak.html
// cleans dom element to prevent memory leaks
function domPurge(d) {
    var a = d.attributes, i, l, n;
    if (a) {
        for (i = a.length - 1; i >= 0; i -= 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') {
                d[n] = null;
            }
        }
    }
    a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            domPurge(d.childNodes[i]);
       }
    }
}

function domRemove(id) {
    var elem = document.getElementById(id);
    domPurge(elem);
    return elem.parentNode.removeChild(elem);
}
wird Farrell
quelle
-3

Dies ist die beste Funktion, um ein Element ohne Skriptfehler zu entfernen:

function Remove(EId)
{
    return(EObj=document.getElementById(EId))?EObj.parentNode.removeChild(EObj):false;
}

Hinweis an EObj=document.getElementById(EId).

Dies ist EIN Gleichheitszeichen nicht ==.

Wenn ein Element EIdvorhanden ist, wird es von der Funktion entfernt, andernfalls wird false zurückgegeben, nicht error.

Amin Atabakzadeh
quelle
4
Erstellt eine globale Variable.
bjb568
1
Es ist auch eine schlechteste Version einer anderen Antwort , aber 2 Jahre zu spät.
Emile Bergeron