Rimozione di elementi in base al nome della classe?


126

Ho il codice qui sotto per trovare elementi con il loro nome di 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++) {

}

Semplicemente non so come rimuoverli ..... DEVO fare riferimento al genitore o qualcosa del genere? Qual è il modo migliore per gestirlo?

@ Karim79:

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

Ecco l'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>

Modifica: ben finito usando solo l'opzione jQuery.


4
Onestamente, il modo migliore è usare solo jQuery. Non capisco davvero perché qualcuno vorrebbe più eseguire manualmente la manipolazione del DOM.
Tyler Eaves,

7
Non so lol .... Sento che mi sentirei sporca conoscendo i framework e non avendo alcuna conoscenza di poter effettivamente usare la vaniglia JS. Dal momento che non sono una persona ENORME di JS, provo e codice solo con JS vaniglia quando lo uso in modo da non dimenticare le cose lol
Brett

20
Destra. Chi al mondo vorrebbe essere uno sviluppatore competente e completo. Assurdo!
user113716

1
Un buon approccio, ovviamente, ma solo perché stai usando jQuery, non significa che devi rinunciare a capire come funziona o cosa offre il DOM sottostante. Probabilmente potresti riparare la tua auto se lo desideri (The DOM), ma il tuo meccanico è probabilmente più esperto (il team di jQuery).
Lior Cohen,

2
@Lior: Sì, beh, il mio meccanico non ha bisogno di aiutarmi a girare la chiave o rotolare giù dalla finestra. ; o)
user113716

Risposte:


189

Usando jQuery (che potresti davvero usare in questo caso, penso), potresti farlo in questo modo:

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

Altrimenti, dovrai rimuovere il genitore di ciascun elemento per rimuoverlo:

element.parentNode.removeChild(element);

41
+0,75 per l'utilizzo di jQuery, +0,25 per fornire anche una soluzione non jQuery: p
ThiefMaster

7
+0,01 per l'utilizzo di jQuery, +0,99 per fornire anche una soluzione non jQuery: p
Alex Pyzhianov

183

Se preferisci non usare JQuery:

function removeElementsByClass(className){
    var elements = document.getElementsByClassName(className);
    while(elements.length > 0){
        elements[0].parentNode.removeChild(elements[0]);
    }
}

1
Una quantità sorprendente di soluzioni non funzionanti là fuori. Questo è giusto. Grazie!
penguinsource

11
Se qualcuno si chiede perché rimuova sempre il primo elemento (indice 0), è perché quando rimuovi un elemento, riduce anche l' elementsarray.
Jefferson Lima,

che dire degli altri indici (accetta l'indice 0)?
ofir_aghai

1
@ofir_aghai come @JeffersonLima indica che getElementsByClassNameè una collezione dal vivo. developer.mozilla.org/en-US/docs/Web/API/NodeList
Veikko Karsikko

2
Bella osservazione sul fatto che la matrice di elementi si restringe
ferralucho,

33

Usando ES6 potresti fare come:

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>


Per sfruttare ulteriormente ES6, che ne dici di: var removeElements = (elms) => [... elms] .forEach (el => el.remove ());
Calculuswhiz l'

1
Risposta migliore Grazie!
Francesco,

25

In Javascript puro, senza jQuery o ES6, potresti fare:

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

while (elements.length > 0) elements[0].remove();

2
Risposta più chiara senza jQuery e ES6
Eric

2
Forse la tua risposta è arrivata dopo - dovrebbe essere quella accettata perché non dipende da jQuery. In generale è meglio usare vanilla-js, non è vero?
Luckyfella

La migliore risposta senza jQuery inutile e pieno di stress. Dì NO a jQuery. Sì al gelato alla vaniglia!
Thanasis,

13

Questo funziona per me

while (document.getElementsByClassName('my-class')[0]) {
        document.getElementsByClassName('my-class')[0].remove();
    }

10

Brett: sei a conoscenza del fatto che il getElementyByClassNamesupporto da IE 5.5 a 8 non è presente secondo quirksmode ? Sarebbe meglio seguire questo schema se ti interessa la compatibilità tra browser:

  • Ottieni elemento contenitore per ID.
  • Ottieni gli elementi figlio necessari per nome tag.
  • Esamina i figli, verifica la corrispondenza della proprietà className.
  • elements[i].parentNode.removeChild(elements[i]) come hanno detto gli altri ragazzi.

Esempio rapido:

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

Ecco una breve demo.

EDIT: ecco la versione fissa, specifica per il tuo markup:

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

Il problema era colpa mia; quando si rimuove un elemento dall'array di elementi risultante, la lunghezza cambia, quindi un elemento viene ignorato ad ogni iterazione. La soluzione è archiviare un riferimento a ciascun elemento in un array temporaneo, quindi successivamente passare su quelli, rimuovendo ciascuno dal DOM.

Provalo qui.


Grazie per quello - anche se non è un grosso problema in quanto è per una sezione di amministrazione, quindi davvero una persona lo utilizzerà .... ma prenderà comunque in considerazione i tuoi commenti.
Brett,

@Brett - fallo comunque! Ci vorranno alcuni minuti del tuo tempo e otterrai cinque extra in ufficio :)
karim79

Ok ho provato questo ... ha segnalato la quantità corretta di elementi quando ho fatto un avviso, ma ha rimosso solo due dei quattro con quel nome di classe e ho ricevuto questo errore: col_wrapper [i] non è definito. Aggiornerò il mio post con il codice che ho usato.
Brett,

@Brett - se sei interessato, ho corretto il tuo codice aggiornato e commentato il problema.
karim79,

Amico, questo mi ha aiutato più di quanto tu possa immaginare con un problema che sono stato sconcertato nelle ultime due ore. GRAZIE!
Zoolander,

4

Preferisco usare forEachover for/ whileloop. Per utilizzare è necessario convertire HTMLCollectionin Arrayprimo:

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

Fai attenzione, non è necessario nel modo più efficiente. Solo molto più elegante per me.


4

Una linea

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

Ad esempio puoi fare in questa pagina per rimuovere userinfo

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

1

Sì, devi rimuovere dal genitore:

cur_columns[i].parentNode.removeChild(cur_columns[i]);

1

È possibile utilizzare questa sintassi: node.parentNode

Per esempio:

someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);

2
Questa domanda ha chiesto di rimuovere per className
JoeTidee il

1

La funzione ricorsiva potrebbe risolvere il problema come di seguito

removeAllByClassName = function (className) {
    function findToRemove() {
        var sets = document.getElementsByClassName(className);
        if (sets.length > 0) {
            sets[0].remove();
            findToRemove();
        }
    }
    findToRemove();
};
//
removeAllByClassName();

1
Haha ha evitato un ciclo. <3
Ivan Ivković,

0

Nel caso in cui si desideri rimuovere elementi aggiunti in modo dinamico, provare questo:

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

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

0

È molto semplice, one-liner, utilizzando l'operatore spread ES6 due document.getElementByClassName restituisce una raccolta HTML.

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

-1

Il bug che salta gli elementi in questo (codice dall'alto)

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

può essere risolto semplicemente eseguendo il loop all'indietro come segue (in modo che l'array temporaneo non sia necessario)

var len = cells.length;
for(var i = len-1; i >-1; i--) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
   }
}

Questo è un po 'complicato. Perché non usare un ciclo while invece? (vedi la mia risposta)
tocqueville

@tocqueville La domanda pubblicata utilizzava un ciclo for. Stavo semplicemente sottolineando come correggere il bug con minime modifiche al suo codice.
shao.lo,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.