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.