Supprimer l'élément par id


1129

Lorsque vous supprimez un élément avec JavaScript standard, vous devez d'abord vous rendre à son parent:

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

Devoir aller au nœud parent me semble un peu étrange, y a-t-il une raison pour que JavaScript fonctionne comme ça?


534
Comme James l'a dit, le DOM ne prend pas en charge la suppression directe d'un objet. Vous devez aller à son parent et le retirer de là. Javascript ne permet pas à un élément de se suicider, mais il permet l'infanticide ...
Mark Henderson

21
Y a-t-il une raison? Richard Feynman dit non . (Eh bien, la justification technique est facile à voir si vous avez écrit des programmes de structure arborescente. L'enfant doit quand même informer le parent sinon la structure arborescente peut être cassée. Comme il doit le faire de toute façon en interne, s'il vous a fourni une fonction d'une ligne , c'est juste une fonction pratique pour vous que vous pourriez aussi bien vous définir.)
kizzx2

6
La seule raison pour laquelle je vois est qu'il devrait toujours y avoir un élément racine dans un document xml / xhtml, donc vous ne pourrez pas le supprimer car il n'a pas de parent
Alex K

5
J'aime assez la solution de contournement de Johan , et je ne sais pas pourquoi ces fonctions ne sont pas fournies nativement. Comme en témoigne le nombre de téléspectateurs, c'est une opération très courante.
Zaz

12
Vous pouvez utiliser element.remove()directement à partir d'ES5. Vous n'avez pas besoin du parent!
Gibolt

Réponses:


659

Je sais que l'augmentation des fonctions DOM natives n'est pas toujours la solution la meilleure ou la plus populaire, mais cela fonctionne bien pour les navigateurs modernes.

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]);
        }
    }
}

Et puis vous pouvez supprimer des éléments comme celui-ci

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

ou

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

Remarque: cette solution ne fonctionne pas pour IE 7 et les versions antérieures. Pour plus d'informations sur l'extension du DOM, lisez cet article .

EDIT : Revoir ma réponse en 2019, node.remove()est venu à la rescousse et peut être utilisé comme suit (sans le polyfill ci-dessus):

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

ou

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

Ces fonctions sont disponibles dans tous les navigateurs modernes (pas IE). En savoir plus sur MDN .


3
Ne devrait-il pas s'agir de [document.getElementsByClassName ("mes-éléments") [0] .remove (); ] Je pense que la fonction remove () n'est pas implémentée par les tableaux. Pour supprimer tous les éléments d'une classe ou tout sélecteur renvoyant un tableau, vous devez parcourir tous les éléments et appeler remove () sur chacun.
Sedat Kilinc

1
@SedatKilinc, avez-vous essayé l'extrait réel? Il n'y a pas de tableaux impliqués, mais plutôt NodeListou HTMLCollectionqui sont un ensemble d'éléments de type tableau. La deuxième définition de méthode permet de supprimer ces "ensembles d'éléments".
Johan Dettmar

1
L'exécution dans la console Chrome ne semble supprimer qu'un élément à la fois lors de l'utilisation document.getElementsByClassName("my-elements").remove();. Edit: en fait, il supprime un groupe mais nécessite une nouvelle exécution pour terminer. Essayez-le sur cette page avec la classe "comment-copy".
DanielST

2
@slicedtoad vous avez raison, ma mauvaise. J'ai modifié la fonction pour faire une boucle en arrière à travers les éléments. Semble bien fonctionner. Le comportement dont vous parlez est probablement dû aux index mis à jour.
Johan Dettmar

1
Ne fais pas ça. Supprimez simplement les éléments comme le veut la langue Toute personne familiarisée avec l'analyse XML reconnaîtra la nécessité de se rendre auprès du parent pour supprimer les enfants. HTML est un sur-ensemble de XML (en quelque sorte).
Hal50000

283

Crossbrowser et IE> = 11:

document.getElementById("element-id").outerHTML = "";

3
Cela semble la solution la plus simple, la plus fiable et la plus rapide. Je n'ai pas besoin de supprimer l'élément, donc je saute la dernière ligne, mais cela ne devrait pas ajouter de surcharge de toute façon. Remarque : J'ai trouvé cela en essayant de trouver une $.readyalternative plus rapide que js aux noscriptbalises. Afin de l'utiliser comme je le voulais, j'ai dû l'envelopper dans une setTimeoutfonction de 1 ms . Cela résout tous mes problèmes à la fois. Gracias.
dgo

Gardez à l'esprit que outerHTMLc'est encore un nouvel ajout à la norme. Si vous recherchez une assistance sur un logiciel> 6 au moment de la rédaction, vous aurez besoin d'une autre solution. La removefonction mentionnée par d'autres est un cas similaire. Comme d'habitude, il est sûr d'implémenter un polyfill.
Super Cat

delete elementne fait rien car vous ne pouvez pas supprimer des variables dans JS, seulement des clés;) Vérifiez par vous-même que cela ne fonctionne pas console.log(element)après delete element...
Ivan Kleshnin

2
C'est un peu plus lent que removeChild(environ 6-7% sur mon système). Voir jsperf.com/clear-outerhtml-v-removechild/2
Alejandro García Iglesias

1
Cela pourrait laisser un espace où se trouvait un iframe si c'est ce que vous essayez de supprimer.
lacostenycoder

164

Vous pouvez créer une removefonction pour que vous n'ayez pas à y penser à chaque fois:

function removeElement(id) {
    var elem = document.getElementById(id);
    return elem.parentNode.removeChild(elem);
}

12
Si vous voulez le one-liner sans devenir mondial, vous pouvez passer elemà remove.elem. De cette façon, la fonction se référence elle-même, vous n'avez donc pas à créer une autre variable globale. :-)
twiz

4
alors, pourquoi avez-vous besoin de retourner l'elem? Pourquoi pasfunction remove(id) { document.getElementById(id).parentNote.removeChild(document.getElementById(id)); }
Zach Lysobey

4
@ZachL: Bien que votre solution puisse sembler la plus évidente, elle effectue deux recherches DOM qui sont plus lentes et quelque chose que les autres solutions semblent vouloir éviter.
Wk_of_Angmar

3
Ne marche pas. Trop d'erreurs. Cela fonctionne: var elem = document.getElementById ('id'); elem.parentNode.removeChild (elem);
Mitch Match

2
Wow, pourquoi c'est si compliqué. Passez simplement l'élément lui-même à la fonction au lieu d'une chaîne id. De cette façon, l'élément est accessible dans toute la fonction et il reste un seul revêtement
David Fariña

97

C'est ce que le DOM prend en charge . Recherchez «supprimer» ou «supprimer» sur cette page et removeChild est le seul qui supprime un nœud.


13
Cela répond à ma question d'origine, mais pourquoi JavaScript fonctionne-t-il ainsi?
Zaz

5
Je devine juste ici, mais je suppose que cela a à voir avec la gestion de la mémoire. Le nœud parent contient probablement une liste de pointeurs vers les nœuds enfants. Si vous venez de supprimer un nœud (sans utiliser de parent), le parent contiendrait toujours le pointeur et provoquerait une fuite de mémoire. L'API vous oblige donc à appeler une fonction sur le parent pour supprimer l'enfant. c'est aussi bien car cela peut faire défiler l'arborescence à travers les nœuds enfants en appelant remove sur chacun d'eux, et sans fuite de mémoire.
Chadams

2
hé les gars, même si cette référence n'a pas cela, je l'ai trouvé accidentellement. l'écriture element.remove();fonctionnera. C'est peut-être quelque chose de nouveau. Mais la première fois pour moi et ça marche. Je pense que cela aurait toujours dû fonctionner car il est très basique doit avoir des trucs.
Muhammad Umer

1
Mais cela ne fonctionne pas dans IE7 et les versions antérieures. Depuis IE7 et les
versions antérieures

1
Si je devais deviner, la raison pour laquelle cela fonctionne comme ceci est que les éléments DOM ne peuvent pas se supprimer. Vous enlevez le tapis proverbial sous ses pieds. Vous devez le retirer du conteneur. C'est du moins ainsi que j'essaie d'y penser.
PhilT

82

Le DOM est organisé dans une arborescence de nœuds, où chaque nœud a une valeur, ainsi qu'une liste de références à ses nœuds enfants. element.parentNode.removeChild(element)Imite donc exactement ce qui se passe en interne: d'abord, accédez au nœud parent, puis supprimez la référence au nœud enfant.

A partir de DOM4, une fonction d'assistance est fournie à faire la même chose: element.remove(). Cela fonctionne dans 87% des navigateurs (à partir de 2016), mais pas dans IE 11. Si vous devez prendre en charge des navigateurs plus anciens, vous pouvez:


2
Veuillez ne pas "modifier les fonctions natives du DOM" .
Emile Bergeron

36

Pour supprimer un élément:

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

Pour supprimer tous les éléments avec par exemple un certain nom de classe:

 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]);

Ceci est bien couvert par les réponses existantes.
KyleMit

4
+1 Pour un exemple simple de suppression par nom de classe. Ce n'est pas bien couvert par les autres réponses
Louise Eggleton

Pourquoi la if(list[i] && list[i].parentElement)ligne est-elle nécessaire? L'existence de chaque élément n'est-elle pas garantie par le fait qu'il a été retourné par la getElementsByClassNameméthode?
Hydrothermal

Malheureusement, l'existence n'est pas vraiment garantie pour autant que je sache, mais je n'en connais pas les détails. Je viens de connaître une étrange valeur indéfinie ou nulle une fois, et j'ai mis ce chèque sans autre enquête. C'est donc un peu de hack.
csjpeter

Ça devrait êtredocument.getElementsByClassName(...
Worker

21

vous pouvez simplement utiliser element.remove()


13
element.remove()n'est pas un code JavaScript valide et ne fonctionne que dans certains navigateurs tels que Chrome .
Zaz

4
Josh, c'est du javascript valide, sauf que Firefox et Chrome l'ont implémenté (Voir MDN)
Tim Nguyen

10
Ma mauvaise, element.remove() c'est du JavaScript valide avec DOM4 , et ça marche dans tous les navigateurs modernes, naturellement à l'exception d'Internet Explorer.
Zaz

24
Fonctionne bien sur FireFox et Chrome. qui se soucie d'IE
Arun Sharma

13
les gens avec des emplois se soucient d'IE!
sqram

18

La ChildNode.remove()méthode supprime l'objet de l'arborescence à laquelle il appartient.

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

Voici un violon qui montre comment appeler document.getElementById('my-id').remove()

https://jsfiddle.net/52kp584L/

**

Il n'est pas nécessaire d'étendre NodeList. Il a déjà été mis en œuvre.

**


2
Remarque, cela n'est pris en charge dans aucune version d'IE!
MacroMan

1
Si vous développez encore pour IE, je suis vraiment désolé pour vous.
Alex Fallenstedt

Vous ne développez pas pour IE? Je suis vraiment désolé pour vos clients ou clients.
MacroMan

13

Vous pouvez supprimer directement cet élément en utilisant la remove()méthode du DOM.

voici un exemple:

let subsWrapper = document.getElementById("element_id");
subsWrapper.remove();
//OR directly.
document.getElementById("element_id").remove();


7

Devoir aller au nœud parent me semble un peu étrange, y a-t-il une raison pour que JavaScript fonctionne comme ça?

Le nom de la fonction est removeChild(), et comment est-il possible de supprimer l'enfant lorsqu'il n'y a pas de parent? :)

En revanche, vous n'avez pas toujours à l'appeler comme vous l'avez montré. element.parentNodeest seulement une aide pour obtenir le nœud parent du nœud donné. Si vous connaissez déjà le nœud parent, vous pouvez simplement l'utiliser comme ceci:

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

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

Pour ajouter quelque chose de plus:

Certaines réponses ont souligné qu'au lieu d'utiliser parentNode.removeChild(child);, vous pouvez utiliser elem.remove();. Mais comme je l'ai remarqué, il y a une différence entre les deux fonctions, et ce n'est pas mentionné dans ces réponses.

Si vous utilisez removeChild(), il renverra une référence au nœud supprimé.

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

Mais si vous utilisez elem.remove();, il ne vous renverra pas la référence.

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

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

Ce comportement peut être observé dans Chrome et FF. Je crois que ça vaut la peine de le remarquer :)

J'espère que ma réponse ajoute de la valeur à la question et sera utile !!


6

Les fonctions qui utilisent ele.parentNode.removeChild (ele) ne fonctionneront pas pour les éléments que vous avez créés mais pas encore insérés dans le code HTML. Les bibliothèques comme jQuery et Prototype utilisent judicieusement une méthode comme la suivante pour contourner cette limitation.

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

Je pense que JavaScript fonctionne comme ça parce que les concepteurs originaux du DOM ont tenu la navigation parent / enfant et la navigation précédente / suivante comme une priorité plus élevée que les modifications DHTML qui sont si populaires aujourd'hui. La possibilité de lire à partir d'un <input type = 'text'> et d'écrire sur un autre par emplacement relatif dans le DOM était utile au milieu des années 90, à une époque où la génération dynamique de formulaires HTML entiers ou d'éléments d'interface graphique interactifs était à peine un scintillement un œil de développeur.


3

Devoir aller au nœud parent me semble un peu étrange, y a-t-il une raison pour que JavaScript fonctionne comme ça?

IMHO: La raison de ceci est la même que celle que j'ai vue dans d'autres environnements: vous effectuez une action basée sur votre "lien" vers quelque chose. Vous ne pouvez pas le supprimer pendant que vous y êtes lié.

Comme couper une branche d'arbre. Asseyez-vous sur le côté le plus proche de l'arbre pendant la coupe ou le résultat sera ... malheureux (bien que drôle).


2

Celui-ci vient en fait de FireFox ... pour une fois, IE était en tête du peloton et permettait la suppression d'un élément directement.

C'est juste mon hypothèse, mais je crois que la raison pour laquelle vous devez supprimer un enfant via le parent est due à un problème avec la façon dont FireFox a géré la référence.

Si vous appelez un objet pour valider hari-kari directement, puis immédiatement après sa mort, vous conservez toujours cette référence. Cela a le potentiel de créer plusieurs bogues désagréables ... comme ne pas le supprimer, le supprimer mais garder des références qui semblent valides, ou simplement une fuite de mémoire.

Je crois que lorsqu'ils ont réalisé le problème, le travail a consisté à supprimer un élément par le biais de son parent, car lorsque l'élément est parti, vous détenez simplement une référence au parent. Cela arrêterait tout ce désagrément, et (si la fermeture d'un arbre nœud par nœud, par exemple) se «fermait» assez bien.

Ce devrait être un bogue facilement réparable, mais comme pour beaucoup d'autres choses dans la programmation Web, la version a probablement été précipitée, ce qui a conduit à cela ... et au moment où la prochaine version est apparue, suffisamment de gens l'utilisaient pour changer cela conduirait à casser un tas de code.

Encore une fois, tout cela n'est que ma conjecture.

Cependant, j'ai hâte de voir le jour où la programmation Web sera enfin nettoyée au printemps, toutes ces étranges petites idiosynchracies seront nettoyées et tout le monde commencera à jouer selon les mêmes règles.

Probablement le lendemain du jour où mon robot serviteur me poursuit pour arriérés de salaire.


10
Je doute que Firefox en soit responsable. removeChildest une méthode de l' interface DOM niveau 1Node .
Felix Kling

0

D'après ce que je comprends, la suppression d'un nœud directement ne fonctionne pas dans Firefox, seulement Internet Explorer. Donc, pour prendre en charge Firefox, vous devez vous adresser au parent pour supprimer son enfant.

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


6
Cela ne répond pas vraiment à ma question, et la page à laquelle vous avez lié fournit une solution pire que la mienne.
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);
}

-3

C'est la meilleure fonction pour supprimer un élément sans erreur de script:

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

Remarque à EObj=document.getElementById(EId).

Ce n'est pas UN signe égal ==.

si l'élément EIdexiste, la fonction le supprime, sinon il renvoie faux, non error.


4
Crée une variable globale.
bjb568

1
C'est aussi la pire version d' une autre réponse , mais avec 2 ans de retard.
Emile Bergeron
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.