Usunąć elementy według nazwy klasy?


126

Mam poniższy kod, aby znaleźć elementy z ich nazwą klasy:

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

}

Po prostu nie wiem, jak je usunąć ..... MUSZĘ odwołać się do rodzica czy coś? Jak najlepiej sobie z tym poradzić?

@ Karim79:

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

Oto kod 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>

Edycja: Cóż, po prostu skorzystałem z opcji jQuery.


4
Szczerze mówiąc, najlepszym sposobem jest użycie jQuery. Naprawdę nie rozumiem, dlaczego ktoś chciałby już ręcznie manipulować DOM.
Tyler Eaves

7
Nie wiem, lol… Po prostu czuję się brudny, znając frameworki i nie mając żadnej wiedzy o tym, że mogę faktycznie używać waniliowego JS. Ponieważ nie jestem wielkim osoba JS, staram i po prostu kod z wanilii JS, kiedy go używać, więc nie zapomnieć rzeczy lol
Brett

20
Dobrze. Kto chciałby być doświadczonym i wszechstronnym programistą. Absurdalny!
user113716

1
Dobre podejście, oczywiście, ale tylko dlatego, że używasz jQuery, nie oznacza, że ​​musisz rezygnować ze zrozumienia, jak to działa lub co oferuje bazowy DOM. Prawdopodobnie mógłbyś naprawić swój samochód, gdybyś chciał (DOM), ale Twój mechanik jest prawdopodobnie bardziej doświadczony (zespół jQuery).
Lior Cohen

2
@Lior: Tak, mój mechanik nie musi mi pomagać przekręcić klucz ani opuścić szyby. ; o)
user113716

Odpowiedzi:


189

Używając jQuery (którego naprawdę możesz użyć w tym przypadku, myślę), możesz zrobić to w następujący sposób:

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

W przeciwnym razie będziesz musiał użyć rodzica każdego elementu, aby go usunąć:

element.parentNode.removeChild(element);

41
+0,75 za używanie jQuery, +0,25 za rozwiązanie inne niż jQuery: p
ThiefMaster

7
+0,01 za używanie jQuery, +0,99 za udostępnienie rozwiązania innego niż jQuery: p
Alex Pyzhianov

183

Jeśli wolisz nie używać JQuery:

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

1
Zaskakująca liczba niedziałających rozwiązań. To jest słuszne. Dzięki!
penguinsource,

11
Jeśli ktoś się zastanawia, dlaczego zawsze usuwa pierwszy element (indeks 0), to dlatego, że kiedy usuwasz element, zmniejsza on również elementstablicę.
Jefferson Lima

a co z innymi indeksami (zaakceptuj indeks 0)?
ofir_aghai

1
@ofir_aghai as @JeffersonLima wskazuje, że getElementsByClassNamejest to kolekcja na żywo. developer.mozilla.org/en-US/docs/Web/API/NodeList
Veikko Karsikko

2
Niezła obserwacja na temat kurczenia się tablicy elementów
ferralucho,

33

Korzystając z ES6, możesz:

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>


Aby jeszcze bardziej skorzystać z ES6, co powiesz na: var removeElements = (elms) => [... elms] .forEach (el => el.remove ());
Calculuswhiz

1
Najlepsza odpowiedź dzięki!
Francesco

25

W czystym Javascript, bez jQuery lub ES6, możesz zrobić:

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

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

2
Najjaśniejsza odpowiedź bez jQuery i ES6
Eric

2
Może twoja odpowiedź przyszła później - powinna być zaakceptowana, ponieważ jest niezależna od jQuery. Generalnie lepiej jest używać vanilla-js, prawda?
Luckyfella

Najlepsza odpowiedź bez niepotrzebnego i beznadziejnego jQuery. Powiedz NIE jQuery. Tak z lodem waniliowym!
Thanasis

13

To działa dla mnie

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

10

Brett - czy wiesz, że zgodnie z quirksmode niegetElementyByClassName ma wsparcia od IE 5.5 do 8 ? Lepiej będzie postępować zgodnie z tym wzorcem, jeśli zależy Ci na kompatybilności z różnymi przeglądarkami:

  • Pobierz element kontenera według identyfikatora.
  • Uzyskaj potrzebne elementy podrzędne według nazwy tagu.
  • Wykonaj iterację po elementach potomnych, sprawdź dopasowanie właściwości className.
  • elements[i].parentNode.removeChild(elements[i]) jak mówili inni faceci.

Szybki przykład:

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

Oto krótkie demo.

EDYCJA: Oto poprawiona wersja, specyficzna dla Twojego znacznika:

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

Problem był moją winą; kiedy usuwasz element z wynikowej tablicy elementów, długość zmienia się, więc jeden element jest pomijany przy każdej iteracji. Rozwiązaniem jest przechowywanie odniesienia do każdego elementu w tymczasowej tablicy, a następnie pętla nad nimi, usuwając każdy z nich z DOM.

Spróbuj tutaj.


Dzięki za to - choć nie jest to duży problem, ponieważ dotyczy sekcji administracyjnej, więc naprawdę jedna osoba będzie go używać ... ale nadal będzie brać pod uwagę twoje komentarze.
Brett

@Brett - zrób to mimo wszystko!
Zajmie

Ok, próbowałem tego ... zgłosił poprawną ilość elementów, kiedy zrobiłem alert, ale usunął tylko dwa z czterech o tej nazwie klasy i otrzymałem ten błąd: col_wrapper [i] jest niezdefiniowany. Zaktualizuję swój post kodem, którego użyłem.
Brett

@Brett - jeśli jesteś zainteresowany, poprawiłem Twój zaktualizowany kod i skomentowałem problem.
karim79

Człowieku, pomogło mi to bardziej, niż możesz sobie wyobrazić, z problemem, w którym byłem zaskoczony przez ostatnie dwie godziny. DZIĘKUJĘ CI!
Zoolander

4

Wolę używać forEachover for/ whilelooping. Aby użyć, należy najpierw przekonwertować HTMLCollectionna Array:

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

Zwróć uwagę, nie jest to konieczny najbardziej efektywny sposób. Po prostu dużo bardziej eleganckie dla mnie.


4

Jedna linia

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

Na przykład możesz to zrobić na tej stronie, aby usunąć informacje o użytkowniku

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

1

Tak, musisz usunąć z rodzica:

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

1

Możesz użyć tej składni: node.parentNode

Na przykład:

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

2
To pytanie zadane do usunięcia przez className
JoeTidee

1

Funkcja rekurencyjna może rozwiązać twój problem, jak poniżej

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

1
Haha uniknął pętli. <3
Ivan Ivković

0

Jeśli chcesz usunąć elementy, które są dodawane dynamicznie, spróbuj tego:

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

LUB

const elem= document.getElementsByClassName('column')

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

0

Jest to bardzo proste, jednowierszowe, używając operatora rozszerzania ES6 due document.getElementByClassName zwraca kolekcję HTML.

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

-1

Błąd pomijania elementów w tym (kod z góry)

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

można naprawić, po prostu wykonując pętlę wstecz w następujący sposób (aby tymczasowa tablica nie była potrzebna)

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

To trochę skomplikowane. Dlaczego zamiast tego nie użyć cyklu while? (zobacz moją odpowiedź)
tocqueville

@tocqueville W opublikowanym pytaniu użyto pętli for. Po prostu pokazałem, jak naprawić błąd przy minimalnych zmianach w jego kodzie.
shao.lo

-3

Możesz skorzystać z prostego rozwiązania, po prostu zmień klasę, zaktualizowany zostanie filtr HTML Collection:

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


1
To nie zadziała, ponieważ tablica pętli jest modyfikowana wewnątrz samej pętli. W rezultacie ostatni element zostanie pominięty.
tocqueville
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.