Supprimer des éléments par nom de classe?

126

J'ai le code ci-dessous pour trouver des éléments avec leur nom de classe:

// Get the element by their class name
var cur_columns = document.getElementsByClassName('column');

// Now remove them

for (var i = 0; i < cur_columns.length; i++) {

}

Je ne sais tout simplement pas comment les supprimer ... Dois-je faire référence au parent ou à quelque chose? Quelle est la meilleure façon de gérer cela?

@ Karim79:

Voici le JS:

var col_wrapper = document.getElementById("columns").getElementsByTagName("div");
var len = col_wrapper.length;

alert(len);

for (var i = 0; i < len; i++) {
    if (col_wrapper[i].className.toLowerCase() == "column") {
        col_wrapper[i].parentNode.removeChild(col_wrapper[i]);
    }
}

Voici le HTML:

<div class="columns" id="columns">
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div name="columnClear" class="contentClear" id="columnClear"></div>
</div>

Edit: Eh bien, j'ai simplement utilisé l'option jQuery.

Brett
la source
4
Honnêtement, le meilleur moyen est d'utiliser simplement jQuery. Je ne comprends plus vraiment pourquoi quiconque voudrait faire de la manipulation DOM à la main.
Tyler Eaves
7
Je ne sais pas lol .... Je sens juste que je me sentirais sale en connaissant les frameworks et en n'ayant aucune connaissance de la possibilité d'utiliser le JS vanilla. Puisque je ne suis pas une personne ÉNORME de JS, j'essaie de coder avec vanilla JS quand je l'utilise pour ne pas oublier les choses lol
Brett
20
Droite. Qui diable voudrait être un développeur compétent et bien équilibré. Absurde!
user113716
1
Une bonne approche, bien sûr, mais ce n'est pas parce que vous utilisez jQuery que vous devez renoncer à comprendre comment cela fonctionne ou ce que propose le DOM sous-jacent. Vous pourriez probablement réparer votre voiture si vous le vouliez (Le DOM), mais votre mécanicien est probablement plus expérimenté (l'équipe jQuery).
Lior Cohen
2
@Lior: Oui, mon mécanicien n'a pas besoin de m'aider à tourner la clé ou à faire rouler ma vitre. ; o)
user113716

Réponses:

189

En utilisant jQuery (que vous pourriez vraiment utiliser dans ce cas, je pense), vous pouvez le faire comme suit:

$('.column').remove();

Sinon, vous devrez utiliser le parent de chaque élément pour le supprimer:

element.parentNode.removeChild(element);
Lior Cohen
la source
41
+0,75 pour utiliser jQuery, +0,25 pour donner également une solution non-jQuery: p
ThiefMaster
7
+0.01 pour utiliser jQuery, +0.99 pour donner également une solution non-jQuery: p
Alex Pyzhianov
183

Si vous préférez ne pas utiliser JQuery:

function removeElementsByClass(className){
    var elements = document.getElementsByClassName(className);
    while(elements.length > 0){
        elements[0].parentNode.removeChild(elements[0]);
    }
}
Veikko Karsikko
la source
1
Une quantité surprenante de solutions qui ne fonctionnent pas là-bas. C'est juste. Merci!
penguinsource
11
Si quelqu'un se demande pourquoi il supprime toujours le premier élément (index 0), c'est parce que lorsque vous supprimez un élément, cela réduit également le elementstableau.
Jefferson Lima
qu'en est-il des autres index (accepter l'indice 0)?
ofir_aghai
1
@ofir_aghai comme @JeffersonLima souligne qu'il getElementsByClassNames'agit d'une collection en direct. developer.mozilla.org/en-US/docs/Web/API/NodeList
Veikko Karsikko
2
Belle observation sur le fait que le tableau des éléments se rétrécit
ferralucho
33

En utilisant ES6, vous pouvez faire comme:

const removeElements = (elms) => elms.forEach(el => el.remove());

// Use like:
removeElements( document.querySelectorAll(".remove") );
<p class="remove">REMOVE ME</p>
<p>KEEP ME</p>
<p class="remove">REMOVE ME</p>

Roko C. Buljan
la source
Pour profiter davantage d'ES6, que diriez-vous de: var removeElements = (elms) => [... elms] .forEach (el => el.remove ());
Calculuswhiz
1
Meilleure réponse Merci!
Francesco
25

En Javascript pur, sans jQuery ou ES6, vous pouvez faire:

const elements = document.getElementsByClassName("my-class");

while (elements.length > 0) elements[0].remove();
tocqueville
la source
2
Réponse la plus claire sans jQuery et ES6
Eric
2
Peut-être que votre réponse est venue plus tard - devrait être celle acceptée car elle ne dépend pas de jQuery. En général, il vaut mieux utiliser vanilla-js, n'est-ce pas?
Luckyfella
Meilleure réponse sans le jQuery inutile et bloady. Dites NON à jQuery. Oui à la glace à la vanille!
Thanasis
13

Cela fonctionne pour moi

while (document.getElementsByClassName('my-class')[0]) {
        document.getElementsByClassName('my-class')[0].remove();
    }
Уляна Різник
la source
10

Brett - savez-vous que le getElementyByClassNamesupport d'IE 5.5 à 8 n'est pas là selon quirksmode ?. Vous feriez mieux de suivre ce modèle si vous vous souciez de la compatibilité entre navigateurs:

  • Obtenez l'élément de conteneur par ID.
  • Obtenez les éléments enfants nécessaires par nom de balise.
  • Itérer sur les enfants, tester la propriété className correspondante.
  • elements[i].parentNode.removeChild(elements[i]) comme les autres gars l'ont dit.

Exemple rapide:

var cells = document.getElementById("myTable").getElementsByTagName("td");
var len = cells.length;
for(var i = 0; i < len; i++) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
    }
}

Voici une démo rapide.

EDIT: Voici la version fixe, spécifique à votre balisage:

var col_wrapper = document.getElementById("columns").getElementsByTagName("div");

var elementsToRemove = [];
for (var i = 0; i < col_wrapper.length; i++) {
    if (col_wrapper[i].className.toLowerCase() == "column") {
        elementsToRemove.push(col_wrapper[i]);
    }
}
for(var i = 0; i < elementsToRemove.length; i++) {
    elementsToRemove[i].parentNode.removeChild(elementsToRemove[i]);
}

Le problème était de ma faute; lorsque vous supprimez un élément du tableau d'éléments résultant, la longueur change, de sorte qu'un élément est ignoré à chaque itération. La solution est de stocker une référence à chaque élément dans un tableau temporaire, puis de boucler sur ceux-ci, en supprimant chacun d'eux du DOM.

Essayez-le ici.

karim79
la source
Merci pour cela - même si ce n'est pas un gros problème car c'est pour une section d'administration, donc vraiment une personne l'utilisera ... mais prendra toujours vos commentaires en considération.
Brett
@Brett - faites-le quand même! Cela prendra quelques minutes de votre temps et vous obtiendrez un supplément de cinq ans au bureau :)
karim79
Ok j'ai essayé ceci ... il a signalé la bonne quantité d'éléments lorsque j'ai fait une alerte, mais il n'a supprimé que deux des quatre avec ce nom de classe et j'ai eu cette erreur: col_wrapper [i] n'est pas défini. Je mettrai à jour mon message avec le code que j'ai utilisé.
Brett
@Brett - si vous êtes intéressé, j'ai corrigé votre code mis à jour et commenté le problème.
karim79
Mec, cela m'a aidé plus que tu ne pourrais l'imaginer avec un problème qui m'a étonné ces deux dernières heures. MERCI!
Zoolander
4

Je préfère utiliser forEachover for/ whilelooping. Pour l'utiliser, il est nécessaire de convertir HTMLCollectionen Arraypremier:

Array.from(document.getElementsByClassName("post-text"))
    .forEach(element => element.remove());

Faites attention, ce n'est pas nécessaire de la manière la plus efficace. Juste beaucoup plus élégant pour moi.

Alexandre
la source
4

Une ligne

document.querySelectorAll(".remove").forEach(el => el.remove());

Par exemple, vous pouvez faire dans cette page pour supprimer userinfo

document.querySelectorAll(".user-info").forEach(el => el.remove());
Mohsen
la source
1

Oui, vous devez retirer du parent:

cur_columns[i].parentNode.removeChild(cur_columns[i]);
David Tang
la source
1

Vous pouvez utiliser cette syntaxe: node.parentNode

Par exemple:

someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);
Informatisé
la source
2
Cette question a demandé à supprimer par className
JoeTidee
1

La fonction récursive peut résoudre votre problème comme ci-dessous

removeAllByClassName = function (className) {
    function findToRemove() {
        var sets = document.getElementsByClassName(className);
        if (sets.length > 0) {
            sets[0].remove();
            findToRemove();
        }
    }
    findToRemove();
};
//
removeAllByClassName();
Peut PERK
la source
1
Haha a évité une boucle. <3
Ivan Ivković
0

Si vous souhaitez supprimer des éléments ajoutés dynamiquement, essayez ceci:

document.body.addEventListener('DOMSubtreeModified', function(event) {
    const elements = document.getElementsByClassName('your-class-name');
    while (elements.length > 0) elements[0].remove();
});
lchachurski
la source
0
const elem= document.getElementsByClassName('column')

for (let i = elem.length; 0 < i ; )
    elem[--i].remove();

OU

const elem= document.getElementsByClassName('column')

while (elem.length > 0 )
    elem[0].remove();
Fatih Ertuğral
la source
0

C'est très simple, en une seule ligne, en utilisant l'opérateur de propagation ES6 car document.getElementByClassName renvoie une collection HTML.

[...document.getElementsByClassName('dz-preview')].map(thumb => thumb.remove());
Wolfgang Leon
la source
-1

Le bug des éléments sautés dans ceci (code d'en haut)

var len = cells.length;
for(var i = 0; i < len; i++) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
    }
}

peut être corrigé en exécutant simplement la boucle à l'envers comme suit (pour que le tableau temporaire ne soit pas nécessaire)

var len = cells.length;
for(var i = len-1; i >-1; i--) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
   }
}
shao.lo
la source
C'est un peu compliqué. Pourquoi ne pas utiliser un cycle while à la place? (voir ma réponse)
tocqueville
@tocqueville La question postée utilisait une boucle for. J'indiquais simplement comment corriger le bogue avec des modifications minimes de son code.
shao.lo
-3

Vous pouvez utiliser une solution simple, changez simplement la classe, le filtre de la collection HTML est mis à jour:

var cur_columns = document.getElementsByClassName('column');

for (i in cur_columns) {
   cur_columns[i].className = '';
}

Réf: http://www.w3.org/TR/2011/WD-html5-author-20110705/common-dom-interfaces.html

Gustavo Ruiz
la source
1
Cela ne fonctionnera pas car le tableau de la boucle est modifié à l'intérieur de la boucle elle-même. Le résultat est que le dernier élément sera ignoré.
tocqueville