J'essaie de tester si un élément DOM existe, et s'il existe, supprimez-le et s'il n'existe pas, créez-le.
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);
}
Vérifier s'il existe fonctionne, créer l'élément fonctionne, mais pas supprimer l'élément. Fondamentalement, tout ce code ne fait qu'injecter une iframe dans une page Web en cliquant sur un bouton. Ce que j'aimerais, c'est que l'iframe soit déjà là pour le supprimer. Mais pour une raison quelconque, j'échoue.
javascript
dom
Joshua Redfield
la source
la source
Réponses:
removeChild
doit être invoqué sur le parent, c'est-à-dire:Dans votre exemple, vous devriez faire quelque chose comme:
la source
debug
div. L'utilisationparentNode
est une solution plus générique qui fonctionnera avec n'importe quel élément.Dans la plupart des navigateurs, il existe un moyen un peu plus succinct de supprimer un élément du DOM que d'appeler
.removeChild(element)
son parent, qui consiste simplement à appelerelement.remove()
. En temps voulu, cela deviendra probablement le moyen standard et idiomatique de supprimer un élément du DOM.La
.remove()
méthode a été ajoutée au DOM Living Standard en 2011 ( validation ) et a depuis été mise en œuvre par Chrome, Firefox, Safari, Opera et Edge. Il n'était pris en charge dans aucune version d'Internet Explorer.Si vous souhaitez prendre en charge les anciens navigateurs, vous devrez le caler. Cela s'avère un peu irritant, à la fois parce que personne ne semble avoir créé un shim DOM polyvalent contenant ces méthodes, et parce que nous ne sommes pas en train d'ajouter la méthode à un seul prototype; c'est une méthode de
ChildNode
, qui n'est qu'une interface définie par la spécification et qui n'est pas accessible à JavaScript, nous ne pouvons donc rien ajouter à son prototype. Nous devons donc trouver tous les prototypes qui héritentChildNode
et sont réellement définis dans le navigateur, et y ajouter.remove
.Voici le shim que j'ai trouvé, dont j'ai confirmé le fonctionnement dans IE 8.
Cela ne fonctionnera pas dans IE 7 ou inférieur, car l' extension des prototypes DOM n'est pas possible avant IE 8 . Je pense, cependant, qu'à la veille de 2015, la plupart des gens n'ont pas à se soucier de telles choses.
Une fois que vous les aurez inclus, vous pourrez supprimer un élément DOM
element
du DOM en appelant simplementla source
Il semble que je n'ai pas assez de représentants pour poster un commentaire, donc une autre réponse devra faire.
Lorsque vous dissociez un nœud à l'aide de removeChild () ou en définissant la propriété innerHTML sur le parent, vous devez également vous assurer qu'il n'y a rien d'autre le référençant sinon il ne sera pas réellement détruit et entraînera une fuite de mémoire. Il existe de nombreuses façons dont vous auriez pu prendre une référence au nœud avant d'appeler removeChild () et vous devez vous assurer que les références qui ne sont pas sorties de la portée sont explicitement supprimées.
Doug Crockford écrit ici que les gestionnaires d'événements sont connus comme une cause des références circulaires dans IE et suggère de les supprimer explicitement comme suit avant d'appeler removeChild ()
Et même si vous prenez beaucoup de précautions, vous pouvez toujours obtenir des fuites de mémoire dans IE comme décrit par Jens-Ingo Farley ici .
Et enfin, ne tombez pas dans le piège de penser que la suppression de Javascript est la réponse. Cela semble être suggéré par beaucoup, mais ne fera pas l'affaire. Voici une grande référence sur la compréhension de la suppression par Kangax.
la source
element.parentNode.removeChild
pour supprimer des éléments, ils restent en vie et peuvent toujours être référencés. Ils ne sont tout simplement pas visibles dans l'arbre dom ordinaire.L'utilisation de Node.removeChild () fait le travail pour vous, utilisez simplement quelque chose comme ceci:
Dans DOM 4, la méthode de suppression est appliquée, mais la prise en charge du navigateur est médiocre selon le W3C:
Mais vous pouvez utiliser la méthode remove si vous utilisez jQuery ...
Dans de nouveaux cadres comme vous pouvez également utiliser des conditions pour supprimer un élément, par exemple
*ngIf
dans Angular et dans React, le rendu de vues différentes, dépend des conditions ...la source
Si vous êtes heureux d'utiliser la fonction brillante:
Pour supprimer complètement l'élément du DOM.
Pour supprimer les éléments sans supprimer les données et les événements, utilisez plutôt ceci:
jQuery Docs
la source