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.

Brett
źródło
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);
Lior Cohen
źródło
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]);
    }
}
Veikko Karsikko
źródło
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>

Roko C. Buljan
źródło
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();
tocqueville
źródło
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();
    }
Уляна Різник
źródło
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.

karim79
źródło
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.

Alexander
źródło
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());
Mohsen
źródło
1

Tak, musisz usunąć z rodzica:

cur_columns[i].parentNode.removeChild(cur_columns[i]);
David Tang
źródło
1

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

Na przykład:

someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);
Komputerowe
źródło
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();
Czy PERK
źródło
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();
});
lchachurski
źródło
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();
Fatih Ertuğral
źródło
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());
Wolfgang Leon
źródło
-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]);
   }
}
shao.lo
źródło
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

Gustavo Ruiz
źródło
1
To nie zadziała, ponieważ tablica pętli jest modyfikowana wewnątrz samej pętli. W rezultacie ostatni element zostanie pominięty.
tocqueville