Estou tentando testar se um elemento DOM existe e, se existir, exclua-o e, se ele não existir, crie-o.
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);
}
Verificar se existe, criar o elemento funciona, mas excluir o elemento não. Basicamente, todo esse código é injetar um iframe em uma página da Web clicando em um botão. O que eu gostaria que acontecesse é se o iframe já estiver lá para excluí-lo. Mas, por alguma razão, estou falhando.
javascript
dom
Joshua Redfield
fonte
fonte
Respostas:
removeChild
deve ser chamado no pai, ou seja:No seu exemplo, você deve fazer algo como:
fonte
debug
div. UsarparentNode
é uma solução mais genérica que funcionará com qualquer elemento.Na maioria dos navegadores, existe uma maneira um pouco mais sucinta de remover um elemento do DOM do que chamar
.removeChild(element)
seu pai, que é apenas chamarelement.remove()
. No devido tempo, isso provavelmente se tornará a maneira padrão e idiomática de remover um elemento do DOM.o
.remove()
método foi adicionado ao DOM Living Standard em 2011 ( confirmação ) e, desde então, foi implementado pelo Chrome, Firefox, Safari, Opera e Edge. Não foi suportado em nenhuma versão do Internet Explorer.Se você deseja oferecer suporte a navegadores mais antigos, será necessário ajustá-lo. Isso acaba sendo um pouco irritante, tanto porque ninguém parece ter feito um calço DOM para todos os fins que contém esses métodos, como também porque não estamos apenas adicionando o método a um único protótipo; é um método de
ChildNode
, que é apenas uma interface definida pela especificação e não é acessível ao JavaScript; portanto, não podemos adicionar nada ao seu protótipo. Portanto, precisamos encontrar todos os protótipos que herdamChildNode
e são realmente definidos no navegador e adicioná.remove
-los.Aqui está o calço que eu criei, que confirmei que funciona no IE 8.
Isso não funcionará no IE 7 ou inferior, pois extensão de protótipos DOM não é possível antes do IE 8 . No entanto, acho que, à beira de 2015, a maioria das pessoas não precisa se preocupar com essas coisas.
Depois de incluí-los, você poderá remover um elemento DOM
element
do DOM simplesmente chamandofonte
Parece que não tenho representante suficiente para postar um comentário, então outra resposta terá que ser feita.
Quando você desvincula um nó usando removeChild () ou configurando a propriedade innerHTML no pai, também é necessário garantir que não haja mais nada referenciando-o, caso contrário ele não será destruído e causará um vazamento de memória. Há várias maneiras pelas quais você poderia ter feito uma referência ao nó antes de chamar removeChild () e ter certeza de que as referências que não saíram do escopo foram explicitamente removidas.
Doug Crockford escreve aqui que os manipuladores de eventos são conhecidos como causa de referências circulares no IE e sugerem removê-los explicitamente da seguinte maneira antes de chamar removeChild ()
E mesmo que você tome muitas precauções, ainda poderá obter vazamentos de memória no IE, conforme descrito por Jens-Ingo Farley aqui .
E, finalmente, não caia na armadilha de pensar que a exclusão do Javascript é a resposta. Parece ser sugerido por muitos, mas não fará o trabalho. Aqui está uma ótima referência sobre como entender a exclusão do Kangax.
fonte
element.parentNode.removeChild
a remoção de elementos, eles permanecem vivos e ainda podem ser referenciados. Eles simplesmente não são visíveis na árvore dom comum.Usando Node.removeChild () faz o trabalho para você, basta usar algo como isto:
No DOM 4, o método remove foi aplicado, mas há um suporte ruim ao navegador de acordo com o W3C:
Mas você pode usar o método remove se estiver usando jQuery ...
Também em novas estruturas, como você pode usar condições para remover um elemento, por exemplo,
*ngIf
em Angular e em React, renderizando diferentes visualizações, depende das condições ...fonte
Se você estiver feliz em usar a função brilhante:
Para excluir completamente o elemento do DOM.
Para remover os elementos sem remover dados e eventos, use isso:
Documentos do jQuery
fonte