Öğeleri sınıf adına göre mi kaldırıyorsunuz?


127

Sınıf adlarıyla öğeleri bulmak için aşağıdaki koda sahibim:

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

}

Sadece onları nasıl kaldıracağımı bilmiyorum ..... Ebeveyne veya başka bir şeye başvurmam gerekiyor mu? Bunu halletmenin en iyi yolu nedir?

@ Karim79:

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

İşte 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>

Düzenleme: Sadece jQuery seçeneğini kullanarak bitti.


4
Açıkçası, en iyi yol sadece jQuery kullanmaktır. Artık neden birinin elle DOM manipülasyonu yapmak isteyeceğini gerçekten anlamıyorum.
Tyler Eaves

7
Ben lol bilmiyorum .... Sadece çerçeveleri bilmek ve vanilya JS'yi gerçekten kullanabilme bilgisine sahip olmadığımı hissediyorum. BÜYÜK bir JS kullanıcısı olmadığım için, kullandığım zaman vanilya JS ile kodlamayı denerim ve bu yüzden bazı şeyleri unutmam lol
Brett

20
Sağ. Dünyadaki kim bilgili ve çok yönlü bir geliştirici olmak ister. Absürt!
user113716

1
Elbette iyi bir yaklaşım, ancak sadece jQuery kullanıyor olmanız, bunun nasıl çalıştığını veya temel DOM'un neler sunduğunu anlamaktan vazgeçmeniz gerektiği anlamına gelmez. İsterseniz muhtemelen arabanızı tamir edebilirsiniz (DOM), ancak tamirciniz muhtemelen bu konuda daha tecrübelidir (jQuery ekibi).
Lior Cohen

2
@Lior: Evet, tamircimin anahtarı çevirmeme veya penceremi açmama yardım etmesine gerek yok. ; o)
user113716

Yanıtlar:


189

JQuery kullanarak (ki bu durumda gerçekten kullanıyor olabilirsiniz), bunu şu şekilde yapabilirsiniz:

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

Aksi takdirde, onu kaldırmak için her bir öğenin üstünü kullanmanız gerekecektir:

element.parentNode.removeChild(element);

41
JQuery kullanmak için +0.75, jQuery olmayan bir çözüm de vermek için +0.25: p
ThiefMaster

9
JQuery kullanmak için +0.01, jQuery olmayan bir çözüm de vermek için +0.99: p
Alex Pyzhianov

186

JQuery'yi kullanmamayı tercih ederseniz:

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

1
Orada şaşırtıcı miktarda çalışmayan çözüm var. Bu doğru. Teşekkürler!
penguinsource

12
Biri neden her zaman ilk öğeyi (dizin 0) kaldırdığını merak ediyorsa, bunun nedeni bir öğeyi kaldırdığınızda elementsdiziyi de küçültmesidir .
Jefferson Lima

Peki diğerleri indeksleri (0 indeksini kabul edin)?
ofir_aghai

2
@ofir_aghai, @JeffersonLima'nın işaret ettiği gibi getElementsByClassNamecanlı bir koleksiyon. developer.mozilla.org/en-US/docs/Web/API/NodeList
Veikko Karsikko


34

ES6 kullanarak şunları yapabilirsiniz:

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>


ES6'dan daha fazla yararlanmak için, şuna ne dersiniz: var removeElements = (elms) => [... elms] .forEach (el => el.remove ());
Calculuswhiz

1
En İyi Cevap Teşekkürler!
Francesco

25

Saf Javascript ile, jQuery veya ES6 olmadan şunları yapabilirsiniz:

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

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

2
JQuery ve ES6 olmadan en net cevap
Eric

2
Belki cevabınız daha sonra geldi - kabul edilen cevap olmalı çünkü jQuery'den bağımsızdır. Genelde vanilya-js kullanmak daha iyidir, değil mi?
Luckyfella

Gereksiz ve aşırı jQuery olmadan en iyi yanıt. JQuery'ye HAYIR deyin. Vanilyalı buza evet!
Thanasis

13

Bu benim için çalışıyor

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

10

Brett - getElementyByClassNameIE 5.5'ten 8'e kadar olan desteğin tuhaf moda göre orada olmadığının farkında mısınız ? Tarayıcılar arası uyumluluğu önemsiyorsanız, bu kalıbı izlemeniz daha iyi olur:

  • Kimliğe göre kapsayıcı öğesini alın.
  • Etiket adına göre gerekli alt öğeleri alın.
  • Alt öğelerde yineleyin, className özelliğinin eşleşip eşleşmediğini test edin.
  • elements[i].parentNode.removeChild(elements[i]) diğerlerinin dediği gibi.

Hızlı örnek:

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

İşte hızlı bir demo.

DÜZENLEME: İşaretlemenize özel sabit sürüm:

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

Sorun benim hatamdı; ortaya çıkan öğe dizisinden bir öğeyi kaldırdığınızda, uzunluk değişir, böylece her yinelemede bir öğe atlanır. Çözüm, geçici bir dizideki her öğeye bir başvuru depolamak, ardından bunlar üzerinde döngü oluşturarak her birini DOM'dan kaldırmaktır.

Burada deneyin.


Bunun için teşekkürler - bir yönetici bölümü için olduğu gibi çok büyük bir sorun olmasa da, gerçekten bir kişi onu kullanıyor olacak ... ancak yine de yorumlarınızı dikkate alacak.
Brett

@Brett - yine de yap! Birkaç dakikanızı alacak ve ofiste ekstra
beşlik alacaksınız

Tamam, bunu denedim ... bir uyarı yaptığımda doğru miktarda öğe bildirdi, ancak bu sınıf adına sahip dört öğeden yalnızca ikisini kaldırdı ve şu hatayı aldım: col_wrapper [i] tanımsız. Gönderimi kullandığım kodla güncelleyeceğim.
Brett

@Brett - ilgileniyorsanız, güncellenmiş kodunuzu düzelttim ve sorun hakkında yorum yaptım.
karim79

Dostum, bu son iki saattir kafamdaki bir soruna hayal edebileceğinizden daha fazla yardımcı oldu. TEŞEKKÜR EDERİM!
Zoolander

4

Ben kullanmayı tercih forEachüzerinde for/ whiledöngü. Kullanmak HTMLCollectioniçin Arrayönce dönüştürmek gerekir :

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

Dikkat edin, en verimli yol gerekli değildir. Benim için çok daha zarif.


4

Tek çizgi

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

Örneğin, bu sayfada kullanıcı bilgilerini kaldırmak için yapabilirsiniz.

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

1

Evet, ebeveynden çıkarmanız gerekir:

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

1

Bu sözdizimini kullanabilirsiniz: node.parentNode

Örneğin:

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

2
Bu sorunun className
JoeTidee

1

Özyinelemeli işlev, sorununuzu aşağıdaki gibi çözebilir

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

1
Haha bir döngüden kaçındı. <3
Ivan Ivković

0

Dinamik olarak eklenen öğeleri kaldırmak istemeniz durumunda şunu deneyin:

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

VEYA

const elem= document.getElementsByClassName('column')

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

0

Çok basit, tek satırlık, ES6 yayılma işleci nedeniyle document.getElementByClassName bir HTML koleksiyonu döndürür.

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

-1

Buradaki atlama öğeleri hatası (yukarıdaki kod)

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

Döngü aşağıdaki gibi geriye doğru çalıştırılarak düzeltilebilir (böylece geçici diziye gerek kalmaz)

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

Bu biraz karmaşık. Neden bunun yerine bir süre döngüsü kullanmıyorsunuz? (
cevabıma

@tocqueville Gönderilen soru bir for döngüsü kullandı. Kodunda en az değişiklikle hatayı nasıl düzelteceğime işaret ediyordum.
shao.lo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.