Ich versuche zu testen, ob ein DOM-Element vorhanden ist. Wenn es vorhanden ist, löschen Sie es und erstellen Sie es, wenn es nicht vorhanden ist.
var duskdawnkey = localStorage["duskdawnkey"];
var iframe = document.createElement("iframe");
var whereto = document.getElementById("debug");
var frameid = document.getElementById("injected_frame");
iframe.setAttribute("id", "injected_frame");
iframe.setAttribute("src", 'http://google.com');
iframe.setAttribute("width", "100%");
iframe.setAttribute("height", "400");
if (frameid) // check and see if iframe is already on page
{ //yes? Remove iframe
iframe.removeChild(frameid.childNodes[0]);
} else // no? Inject iframe
{
whereto.appendChild(iframe);
// add the newly created element and it's content into the DOM
my_div = document.getElementById("debug");
document.body.insertBefore(iframe, my_div);
}
Überprüfen, ob es funktioniert, funktioniert, das Element funktioniert, das Löschen des Elements jedoch nicht. Grundsätzlich fügt dieser Code lediglich einen Iframe in eine Webseite ein, indem er auf eine Schaltfläche klickt. Was ich gerne machen würde, ist, wenn der Iframe bereits da ist, um ihn zu löschen. Aber aus irgendeinem Grund versage ich.
javascript
dom
Joshua Redfield
quelle
quelle
Antworten:
removeChild
sollte auf dem Elternteil aufgerufen werden, dh:In Ihrem Beispiel sollten Sie Folgendes tun:
quelle
debug
Div ist. Die VerwendungparentNode
ist eine allgemeinere Lösung, die mit jedem Element funktioniert.In den meisten Browsern gibt es eine etwas prägnantere Möglichkeit, ein Element aus dem DOM zu entfernen, als das
.removeChild(element)
übergeordnete Element aufzurufen , nämlich nur aufzurufenelement.remove()
. Zu gegebener Zeit wird dies wahrscheinlich die standardmäßige und idiomatische Methode zum Entfernen eines Elements aus dem DOM sein.Die
.remove()
Methode wurde 2011 zum DOM Living Standard hinzugefügt ( Commit ) und wurde seitdem von Chrome, Firefox, Safari, Opera und Edge implementiert. Es wurde in keiner Version von Internet Explorer unterstützt.Wenn Sie ältere Browser unterstützen möchten, müssen Sie diese anpassen. Dies stellt sich als etwas irritierend heraus, sowohl weil anscheinend niemand einen Allzweck-DOM-Shim hergestellt hat, der diese Methoden enthält, als auch weil wir die Methode nicht nur einem einzelnen Prototyp hinzufügen. Es handelt sich um eine Methode von
ChildNode
, die nur eine durch die Spezifikation definierte Schnittstelle ist und für JavaScript nicht zugänglich ist. Daher können wir dem Prototyp nichts hinzufügen. Wir müssen also alle Prototypen finden, die vonChildNode
dem Browser erben und tatsächlich im Browser definiert sind, und sie ergänzen.remove
.Hier ist die Unterlegscheibe, die ich mir ausgedacht habe und von der ich bestätigt habe, dass sie in IE 8 funktioniert.
Dies funktioniert in IE 7 oder niedriger nicht, da die Erweiterung von DOM-Prototypen vor IE 8 nicht möglich ist . Ich denke jedoch, dass sich die meisten Menschen am Rande des Jahres 2015 nicht um solche Dinge kümmern müssen.
Sobald Sie sie Shim eingefügt haben, können Sie ein DOM-Element
element
durch einfaches Aufrufen aus dem DOM entfernenquelle
Scheint, als hätte ich nicht genug Repräsentanten, um einen Kommentar zu schreiben, also muss eine andere Antwort reichen.
Wenn Sie die Verknüpfung eines Knotens mit removeChild () aufheben oder die innerHTML-Eigenschaft für das übergeordnete Element festlegen, müssen Sie auch sicherstellen, dass nichts anderes darauf verweist, da er sonst nicht zerstört wird und zu einem Speicherverlust führt. Es gibt viele Möglichkeiten, wie Sie vor dem Aufrufen von removeChild () einen Verweis auf den Knoten hätten erstellen können, und Sie müssen sicherstellen, dass die Verweise, die nicht außerhalb des Gültigkeitsbereichs liegen, explizit entfernt werden.
Doug Crockford schreibt hier, dass Ereignishandler als Ursache für Zirkelverweise im IE bekannt sind, und schlägt vor, sie wie folgt explizit zu entfernen, bevor removeChild () aufgerufen wird.
Und selbst wenn Sie viele Vorsichtsmaßnahmen treffen, können im IE Speicherlecks auftreten, wie von Jens-Ingo Farley hier beschrieben .
Und schließlich sollten Sie nicht in die Falle tappen, wenn Sie denken, dass das Löschen von Javascript die Antwort ist. Es scheint von vielen vorgeschlagen zu werden, wird aber den Job nicht machen. Hier ist eine gute Referenz zum Verständnis von Löschen durch Kangax.
quelle
element.parentNode.removeChild
, um Elemente zu entfernen, bleiben sie am Leben und können trotzdem referenziert werden. Sie sind im regulären Dombaum einfach nicht sichtbar.Die Verwendung von Node.removeChild () erledigt den Job für Sie. Verwenden Sie einfach Folgendes :
In DOM 4 wurde die Methode zum Entfernen angewendet, aber laut W3C gibt es eine schlechte Browserunterstützung:
Sie können jedoch die Methode remove verwenden, wenn Sie jQuery verwenden ...
Auch in neuen Frameworks, wie Sie Bedingungen verwenden können, um ein Element zu entfernen, z. B.
*ngIf
in Angular und in React, hängt das Rendern unterschiedlicher Ansichten von den Bedingungen ab ...quelle
Wenn Sie gerne jQuery verwenden
Verwenden Sie die brillante jQuery-Funktion:
Um das Element vollständig aus dem DOM zu löschen.
Verwenden Sie stattdessen Folgendes, um die Elemente zu entfernen, ohne Daten und Ereignisse zu entfernen:
Dokumentreferenz
quelle