Próbuję przetestować, czy element DOM istnieje, a jeśli istnieje, usuń go, a jeśli nie istnieje, utwórz go.
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);
}
Sprawdzanie, czy istnieje, działa, tworzenie elementu działa, ale usuwanie elementu nie. Zasadniczo wszystko, co robi ten kod, to wstawienie ramki iframe na stronę internetową poprzez kliknięcie przycisku. Chciałbym, aby iframe już tam było, aby ją usunąć. Ale z jakiegoś powodu zawodzę.
javascript
dom
Joshua Redfield
źródło
źródło
Odpowiedzi:
removeChild
należy wywołać na obiekcie nadrzędnym, tj .:W twoim przykładzie powinieneś robić coś takiego:
źródło
debug
div. KorzystanieparentNode
jest bardziej ogólnym rozwiązaniem, które będzie działać z dowolnym elementem.W większości przeglądarek istnieje nieco bardziej zwięzły sposób usunięcia elementu z DOM niż wywołanie
.removeChild(element)
jego elementu nadrzędnego, czyli po prostu wywołanieelement.remove()
. W odpowiednim czasie prawdopodobnie stanie się to standardowym i idiomatycznym sposobem usuwania elementu z DOM..remove()
Metoda został dodany do DOM standardu życia w roku 2011 ( commit ) i od tego czasu został wdrożony przez Chrome, Firefox, Safari, Opera, i Edge. Nie był obsługiwany w żadnej wersji Internet Explorera.Jeśli chcesz obsługiwać starsze przeglądarki, musisz to zmienić. To okazuje się trochę irytujące, zarówno dlatego, że wydaje się, że nikt nie stworzył uniwersalnego podkładki DOM zawierającej te metody, a także dlatego, że nie dodajemy tej metody do pojedynczego prototypu; jest to metoda
ChildNode
, która jest tylko interfejsem zdefiniowanym przez specyfikację i nie jest dostępna dla JavaScript, więc nie możemy nic dodać do jego prototypu. Musimy więc znaleźć wszystkie prototypy, które dziedzicząChildNode
i są faktycznie zdefiniowane w przeglądarce, i dodać.remove
do nich.Oto shim, który wymyśliłem, który potwierdziłem, że działa w IE 8.
To nie będzie działać w IE 7 lub niższej, ponieważ rozszerzenie prototypów DOM nie jest możliwe przed IE 8 . Myślę jednak, że na skraju 2015 roku większość ludzi nie musi się tym przejmować.
Po dodaniu podkładki dystansowej będziesz mógł usunąć element DOM
element
z DOM po prostu wywołującźródło
Wygląda na to, że nie mam wystarczającej liczby przedstawicieli, aby opublikować komentarz, więc inna odpowiedź będzie musiała wystarczyć.
Kiedy rozłączasz węzeł za pomocą removeChild () lub ustawiając właściwość innerHTML na obiekcie nadrzędnym, musisz również upewnić się, że nie ma nic innego, do czego można by się było odwoływać, inaczej nie zostanie on zniszczony i doprowadzi do wycieku pamięci. Istnieje wiele sposobów, w jakie można było odwołać się do węzła przed wywołaniem metody removeChild () i trzeba upewnić się, że odwołania, które nie wykroczyły poza zakres, zostaną jawnie usunięte.
Doug Crockford pisze tutaj, że procedury obsługi zdarzeń są znaną przyczyną odwołań cyklicznych w IE i sugeruje ich wyraźne usunięcie w następujący sposób przed wywołaniem metody removeChild ()
I nawet jeśli wziąć dużo ostrożności, można jeszcze dostać wycieków pamięci w IE, jak opisana przez Farley Jens-Ingo tutaj .
I wreszcie, nie wpaść w pułapkę myślenia, że JavaScript kasowania jest odpowiedzią. Wydaje się, że jest to sugerowane przez wielu, ale nie wykona zadania. Oto świetne odniesienie do zrozumienia usuwania przez Kangax.
źródło
element.parentNode.removeChild
do usunięcia elementów, pozostają one przy życiu i nadal można się do nich odwoływać. Po prostu nie są widoczne w zwykłym drzewie dom.Użycie Node.removeChild () wykonuje to za Ciebie, po prostu użyj czegoś takiego:
W DOM 4 zastosowano metodę usuwania, ale według W3C istnieje słaba obsługa przeglądarki:
Ale możesz użyć metody remove, jeśli używasz jQuery ...
Również w nowych ramach, takich jak możesz użyć warunków do usunięcia elementu, na przykład
*ngIf
w Angular i React, renderowanie różnych widoków, zależy od warunków ...źródło
Jeśli z przyjemnością skorzystasz z genialnej funkcji:
Aby całkowicie usunąć element z DOM.
Aby usunąć elementy bez usuwania danych i zdarzeń, użyj tego zamiast:
jQuery Docs
źródło