¿Eliminar elementos por nombre de clase?

126

Tengo el siguiente código para encontrar elementos con su nombre de clase:

// 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++) {

}

Simplemente no sé cómo eliminarlos ... ¿DEBO hacer referencia al padre o algo así? ¿Cuál es la mejor manera de manejar esto?

@ Karim79:

Aquí está el 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]);
    }
}

Aquí está el 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>

Editar: Bien terminó usando la opción jQuery.

Brett
fuente
44
Honestamente, la mejor manera es usar jQuery. Realmente no entiendo por qué alguien querría hacer la manipulación DOM a mano.
Tyler Eaves el
77
No sé jajaja ... Siento que me sentiría sucio conociendo frameworks y sin tener ningún conocimiento de poder usar Vanilla JS. Como no soy una persona ENORME JS, trato de codificar con Vanilla JS cuando lo uso para no olvidar las cosas jajaja
Brett
20
Correcto. Quién en la tierra querría ser un desarrollador bien informado y completo. ¡Absurdo!
user113716
1
Un buen enfoque, por supuesto, pero solo porque esté usando jQuery, no significa que deba renunciar a comprender cómo funciona o qué ofrece el DOM subyacente. Probablemente podría arreglar su automóvil si quisiera (The DOM), pero su mecánico probablemente tenga más experiencia en ello (el equipo de jQuery).
Lior Cohen el
2
@Lior: Sí, bueno, mi mecánico no necesita ayudarme a girar la llave o bajar mi ventana. ; o)
user113716

Respuestas:

189

Usando jQuery (que realmente podría estar usando en este caso, creo), podría hacerlo así:

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

De lo contrario, necesitará usar el padre de cada elemento para eliminarlo:

element.parentNode.removeChild(element);
Lior Cohen
fuente
41
+0.75 por usar jQuery, +0.25 por dar también una solución que no sea jQuery: p
ThiefMaster
77
+0.01 por usar jQuery, +0.99 por dar también una solución que no sea jQuery: p
Alex Pyzhianov
183

Si prefiere no usar JQuery:

function removeElementsByClass(className){
    var elements = document.getElementsByClassName(className);
    while(elements.length > 0){
        elements[0].parentNode.removeChild(elements[0]);
    }
}
Veikko Karsikko
fuente
1
Una sorprendente cantidad de soluciones que no funcionan por ahí. Esto es correcto. ¡Gracias!
penguinsource
11
Si alguien se pregunta por qué siempre está eliminando el primer elemento (índice 0), es porque cuando elimina un elemento, también reduce la elementsmatriz.
Jefferson Lima
¿Qué pasa con los otros índices (acepta el índice 0)?
ofir_aghai
1
@ofir_aghai como @JeffersonLima señala que getElementsByClassNamees una colección en vivo. developer.mozilla.org/en-US/docs/Web/API/NodeList
Veikko Karsikko
2
Niza observación sobre el hecho de que los elementos de la matriz se contrae
ferralucho
33

Usando ES6 podría hacer como:

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
fuente
Para aprovechar aún más ES6, ¿qué tal: var removeElements = (elms) => [... elms] .forEach (el => el.remove ());
Calculuswhiz
1
Mejor respuesta ¡Gracias!
Francesco
25

En Javascript puro, sin jQuery o ES6, podría hacer:

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

while (elements.length > 0) elements[0].remove();
Tocqueville
fuente
2
Respuesta más clara sin jQuery y ES6
Eric
2
Tal vez su respuesta llegó más tarde, debería ser la aceptada porque no depende de jQuery. En general, es mejor usar vanilla-js, ¿no?
Luckyfella
La mejor respuesta sin el innecesario y bloady jQuery. Di NO a jQuery. ¡Sí al hielo de vainilla!
Thanasis
13

Esto funciona para mi

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

Brett: ¿eres consciente de que el getElementyByClassNamesoporte de IE 5.5 a 8 no está disponible según el modo peculiar ? Sería mejor seguir este patrón si le interesa la compatibilidad entre navegadores:

  • Obtener elemento contenedor por ID.
  • Obtenga los elementos secundarios necesarios por nombre de etiqueta.
  • Iterar sobre los hijos, probar la propiedad className coincidente.
  • elements[i].parentNode.removeChild(elements[i]) como dijeron los otros chicos.

Ejemplo rápido:

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

Aquí hay una demostración rápida.

EDITAR: Aquí está la versión fija, específica de su marcado:

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

El problema fue mi culpa; cuando elimina un elemento de la matriz de elementos resultante, la longitud cambia, por lo que se omite un elemento en cada iteración. La solución es almacenar una referencia a cada elemento en una matriz temporal, luego hacer un bucle sobre ellos, eliminando cada uno del DOM.

Pruébalo aquí

karim79
fuente
Gracias por eso, aunque no es un gran problema ya que es para una sección de administración, así que realmente una persona lo usará ... pero aún tendrá en cuenta sus comentarios.
Brett el
@Brett: ¡hazlo de todos modos! Tomará unos minutos de tu tiempo y obtendrás
choca esos
Ok, intenté esto ... informó la cantidad correcta de elementos cuando hice una alerta, pero solo eliminó dos de los cuatro con ese nombre de clase y obtuve este error: col_wrapper [i] no está definido. Actualizaré mi publicación con el código que utilicé.
Brett
@Brett: si estás interesado, arreglé tu código actualizado y comenté el problema.
karim79
Hombre, esto me ayudó más de lo que podrías imaginar con un problema que me ha dejado perplejo en las últimas dos horas. ¡GRACIAS!
Zoolander
4

Prefiero usar forEachover for/ whilelooping. Para usar es necesario convertir HTMLCollectiona Arrayprimero:

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

Presta atención, no es necesario la forma más eficiente. Simplemente mucho más elegante para mí.

Alejandro
fuente
4

Una línea

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

Por ejemplo, puede hacerlo en esta página para eliminar userinfo

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

Sí, debe eliminar del padre:

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

Puedes usar esta sintaxis: node.parentNode

Por ejemplo:

someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);
Computarizado
fuente
2
Esta pregunta se pidió eliminar por className
JoeTidee
1

La función recursiva puede resolver su problema como a continuación

removeAllByClassName = function (className) {
    function findToRemove() {
        var sets = document.getElementsByClassName(className);
        if (sets.length > 0) {
            sets[0].remove();
            findToRemove();
        }
    }
    findToRemove();
};
//
removeAllByClassName();
Puede PERK
fuente
1
Jaja evitó un bucle. <3
Ivan Ivković
0

En caso de que desee eliminar elementos que se agregan dinámicamente, intente esto:

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

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

O

const elem= document.getElementsByClassName('column')

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

Es muy simple, de una sola línea, utilizando el operador de propagación ES6 debido document.getElementByClassName devuelve una colección HTML.

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

El error de elementos omitidos en esto (código de arriba)

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

se puede solucionar simplemente ejecutando el bucle hacia atrás de la siguiente manera (para que no se necesite la matriz temporal)

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
fuente
Esto es un poco complicado. ¿Por qué no utilizar un ciclo while en su lugar? (ver mi respuesta)
tocqueville
@tocqueville La pregunta publicada utilizó un bucle for. Simplemente estaba señalando cómo solucionar el error con cambios mínimos en su código.
shao.lo
-3

Puede usar una solución simple, simplemente cambie la clase, el filtro de la Colección HTML se actualiza:

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

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

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

Gustavo Ruiz
fuente
1
Esto no funcionará ya que la matriz del bucle se modifica dentro del propio bucle. El resultado es que se omitirá el último elemento.
tocqueville