Öğeyi kimliğe göre kaldır


1129

Standart JavaScript ile bir öğeyi kaldırırken önce üst öğeye gitmelisiniz:

var element = document.getElementById("element-id");
element.parentNode.removeChild(element);

İlk önce ana düğüme gitmem bana biraz garip geliyor, JavaScript'in böyle çalışmasının bir nedeni var mı?


534
James'in dediği gibi, DOM doğrudan bir nesnenin kaldırılmasını desteklemez. Ebeveynine gitmeli ve oradan çıkarmalısınız. Javascript bir elementin intihar etmesine izin vermez, ancak bebek intiharına izin verir ...
Mark Henderson

21
Bir sebebi var mı? Richard Feynman hayır diyor . (Teknik gerekçe herhangi bir ağaç yapısı programı yazıp yazmadığınızı görmek kolaydır. Çocuk yine de ebeveyni bilgilendirmelidir, aksi takdirde ağaç yapısı bozulabilir. , kendinizi tanımlamanız da sizin için uygun bir işlevdir.)
kizzx2 3

6
Görmemin tek nedeni, her zaman bir xml / xhtml belgesinde bir kök öğe olması gerektiğidir, bu nedenle bir üst öğeye sahip olmadığı için kaldıramazsınız
Alex K 8

5
Johan'ın geçici çözümünü oldukça seviyorum ve bu işlevlerin neden yerel olarak sağlanmadığından emin değilim. İzleyici sayısının kanıtladığı gibi, bu çok yaygın bir işlemdir.
Zaz

12
Sen kullanabilirsiniz element.remove()ES5 itibariyle doğrudan. Ebeveyne ihtiyacınız yok!
Gibolt

Yanıtlar:


659

Yerel DOM işlevlerini artırmanın her zaman en iyi veya en popüler çözüm olmadığını biliyorum, ancak bu modern tarayıcılar için iyi çalışıyor.

Element.prototype.remove = function() {
    this.parentElement.removeChild(this);
}
NodeList.prototype.remove = HTMLCollection.prototype.remove = function() {
    for(var i = this.length - 1; i >= 0; i--) {
        if(this[i] && this[i].parentElement) {
            this[i].parentElement.removeChild(this[i]);
        }
    }
}

Ve sonra böyle öğeleri kaldırabilirsiniz

document.getElementById("my-element").remove();

veya

document.getElementsByClassName("my-elements").remove();

Not: Bu çözüm IE 7 ve önceki sürümlerde çalışmaz. DOM'u genişletme hakkında daha fazla bilgi için bu makaleyi okuyun .

EDIT : Cevabımı 2019 yılında gözden geçirdiğimde, node.remove()kurtarmaya geldi ve aşağıdaki gibi kullanılabilir (yukarıdaki çoklu dolgu olmadan):

document.getElementById("my-element").remove();

veya

[...document.getElementsByClassName("my-elements")].map(n => n && n.remove());

Bu işlevler tüm modern tarayıcılarda (IE değil) kullanılabilir. MDN hakkında daha fazla bilgi edinin .


3
Olmaması gerekir [document.getElementsByClassName ("öğelerim") [0] .remove (); ] Bence kaldırma () işlevi diziler tarafından uygulanmıyor. Sınıfın tüm öğelerini veya dizi döndüren herhangi bir seçiciyi kaldırmak için, tüm öğeleri yinelemeniz ve her birinde remove () öğesini çağırmanız gerekir.
Sedat Kilinc

1
@SedatKilinc, gerçek pasajı denedin mi? Doğrusu hiçbir katılan diziler, ancak vardır NodeListya HTMLCollectiondizi benzeri elemanların kümesi vardır. İkinci yöntem tanımı bu "eleman kümelerinin" kaldırılmasına izin verir.
Johan Dettmar

1
Bunu krom konsolunda çalıştırmak, bir kerede yalnızca bir öğeyi siliyor gibi görünüyor document.getElementsByClassName("my-elements").remove();. Düzenleme: aslında bir demet siler ama bitirmek için yeniden çalışan gerektirir. Bu sayfada "comment-copy" sınıfı ile deneyin.
DanielST

2
@slicedtoad haklısın, benim hatam. Elemanları geriye doğru çevirmek için fonksiyonu değiştirdim. İyi çalışıyor gibi görünüyor. Bahsettiğiniz davranış büyük olasılıkla güncellenmiş dizinlerden kaynaklanmaktadır.
Johan Dettmar

1
Bunu yapma. Dilin istediği şekilde öğeleri kaldırın. XML ayrıştırma hakkında bilgi sahibi olan herkes, çocukları silmek için üst öğeye gitme ihtiyacını tanıyacaktır. HTML, XML'in (bir tür) üst kümesidir.
Hal50000

283

Çapraz tarama ve IE> = 11:

document.getElementById("element-id").outerHTML = "";

3
Bu en basit, en güvenilir ve en hızlı çözüm gibi görünüyor. Bu yüzden son satırı atlamak eleman silmek zorunda değilsiniz, ama bu her iki şekilde herhangi bir ek yük eklememelisiniz .. Not : Ben $.readyjs alternatif noscriptetiketleri daha hızlı bulmaya çalışırken buldum . İstediğim gibi kullanabilmek için 1 ms setTimeoutfonksiyona sarmak zorunda kaldım . Bu, tüm sorunlarımı bir anda çözer. Gracias.
dgo

Unutmayın outerHTML, standarda hala yeni (er) bir katkı. Yazma sırasında herhangi bir yazılımdan> 6 daha fazla destek arıyorsanız, başka bir çözüme ihtiyacınız olacaktır. removeDiğerleri tarafından yukarıda belirtilen fonksiyon benzer bir durumdur. Her zamanki gibi bir çoklu dolgu uygulamak güvenlidir.
Super Cat

delete elementconsole.log(element)delete element
JS'deki

2
Bu biraz daha yavaş removeChild(benim sistemimde yaklaşık% 6-7). Bkz. Jsperf.com/clear-outerhtml-v-removechild/2
Alejandro García Iglesias

1
Bu, kaldırmaya çalıştığınız bir iframe'in eskiden olduğu bir alan bırakabilir.
lacostenycoder

164

Bir removeişlev yapabilir, böylece her seferinde düşünmek zorunda kalmazsınız:

function removeElement(id) {
    var elem = document.getElementById(id);
    return elem.parentNode.removeChild(elem);
}

12
Eğer küresel gitmeden tek astar istiyorsanız, değiştirebilir elemiçin remove.elem. Bu şekilde işlev kendisine referans verir, böylece başka bir global değişken oluşturmanız gerekmez. :-)
twiz

4
öyleyse, elem'i neden iade etmeniz gerekiyor? Neden olmasınfunction remove(id) { document.getElementById(id).parentNote.removeChild(document.getElementById(id)); }
Zach Lysobey

4
@ZachL: Çözümünüz daha açık gibi görünse de, daha yavaş ve diğer çözümlerin kaçınmak istediği bir şey olan iki DOM araması gerçekleştirir.
Wk_of_Angmar

3
Çalışmıyor. Çok fazla hata var. Bu çalışır: var elem = document.getElementById ('id'); elem.parentNode.removeChild (elem);
Mitch Maç

2
Vay, neden bu kadar karmaşık. Öğenin kendisini id dizesi yerine işleve iletmeniz yeterlidir. Bu şekilde eleman tüm fonksiyonda erişilebilir ve ayrıca bir astar kalır
David Fariña

97

DOM destekliyor . Bu sayfada "remove" veya "delete" için arama yapın ve removeChild , düğümü kaldıran tek sayfadır .


13
Bu orijinal soruma cevap veriyor, ancak JavaScript neden böyle çalışıyor?
Zaz

5
Ben sadece burada tahmin ediyorum, ama bellek yönetimi ile ilgili olduğunu varsayabilirim. Üst düğüm büyük olasılıkla alt düğümlere bir işaretçi listesi tutar. Bir düğümü sildiyseniz (üst öğeyi kullanmadan), üst öğe yine de işaretçiyi tutar ve bellek sızıntısına neden olur. Böylece API, çocuğu silmek için ebeveyn üzerinde bir işlevi çağırmaya zorlar. bu da güzel çünkü her biri üzerinde kaldırma çağrısı yapan ve düğüm sızdırmayan çocuk düğümleri boyunca ağacı aşağı doğru yürüyebiliyor.
Chadams

2
hey millet, bu referansa sahip olmasa bile, yanlışlıkla buldum. yazma element.remove();işe yarayacak. Belki de yeni bir şeydir. Ama benim için ilk kez ve işe yarıyor. Bence her zaman işe yaramış olmalı çünkü çok temel şeyler olmalı.
Muhammed Umer

1
Ancak IE7 ve altında çalışmaz. IE7 ve
önceki sürümlerden

1
Tahmin etmek zorunda kalsaydım, bunun böyle çalışmasının nedeni DOM öğelerinin kendilerini kaldıramamasıdır. Meşhur halıyı ayaklarının altından çıkarıyorsunuz. Konteynerden çıkarmanız gerekir. En azından ben böyle düşünmeye çalışıyorum.
PhilT

82

DOM, her düğümün bir değere sahip olduğu bir düğüm ağacında, alt düğümlerine yapılan referansların bir listesi ile organize edilir. Dolayısıyla element.parentNode.removeChild(element), dahili olarak olanları tam olarak taklit eder: Önce ana düğüme gidin, ardından alt düğüme olan referansı kaldırın.

DOM4 itibariyle bir yardımcı fonksiyon aynı şeyi yapmak için sağlanmıştır: element.remove(). Bu , tarayıcıların% 87'sinde (2016 itibariyle) çalışır, ancak IE 11'de çalışmaz. Eski tarayıcıları desteklemeniz gerekiyorsa, şunları yapabilirsiniz:


2
Lütfen "yerel DOM işlevlerini değiştirmeyin" .
Emile Bergeron

36

Bir elemanı kaldırmak için:

 var elem = document.getElementById("yourid");
 elem.parentElement.removeChild(elem);

Örneğin belirli bir sınıf adına sahip tüm öğeleri kaldırmak için:

 var list = document.getElementsByClassName("yourclassname");
 for(var i = list.length - 1; 0 <= i; i--)
 if(list[i] && list[i].parentElement)
 list[i].parentElement.removeChild(list[i]);

Bu, mevcut cevaplar tarafından iyi bir şekilde ele alınmıştır.
KyleMit

4
+1 Sınıf adına göre kaldırmanın basit bir örneği için. Bu, diğer cevaplar tarafından iyi kapsanmamıştır
Louise Eggleton

if(list[i] && list[i].parentElement)Hat neden gerekli? Her öğenin varlığı, getElementsByClassNameyöntem tarafından döndürüldüğü gerçeği ile garanti edilmiyor mu?
Hidrotermal

Maalesef varoluş bildiğim kadarıyla gerçekten garanti edilmiyor, ancak bununla ilgili ayrıntıları bilmiyorum. Sadece bir kez garip tanımsız veya boş değer yaşadım ve bu kontrolü daha fazla araştırma yapmadan orada koydum. Yani bu biraz hack.
csjpeter

O olmalıdocument.getElementsByClassName(...
İşçi

21

sadece kullanabilirsin element.remove()


13
element.remove()geçerli bir JavaScript değil ve yalnızca Chrome gibi belirli tarayıcılarda çalışır .
Zaz

4
Josh, geçerli bir javascript, sadece Firefox ve Chrome bunu uyguladı hariç (Bkz. MDN)
Tim Nguyen

10
Benim hatam, element.remove() olduğu DOM4 ile geçerli bir JavaScript ve doğal olarak Internet Explorer hariç, tüm modern tarayıcılarda çalışır.
Zaz

24
FireFox ve Chrome'da iyi çalışıyor. kimin umrunda
Arun Sharma

13
iş insanlar IE ile ilgileniyor!
sqram

18

ChildNode.remove()Yöntem ait olduğu ağaçtan nesneyi kaldırır.

https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove

İşte nasıl arayabileceğinizi gösteren bir keman document.getElementById('my-id').remove()

https://jsfiddle.net/52kp584L/

**

NodeList'i genişletmeye gerek yoktur. Zaten uygulandı.

**


2
Bunun IE'nin hiçbir sürümünde desteklenmediğini unutmayın!
MacroMan

1
Eğer hala IE için geliştiriyorsanız, sizin için çok üzgünüm.
Alex Fallenstedt

IE için geliştirmiyor musunuz? Müşterileriniz veya müşterileriniz için çok üzgünüm.
MacroMan

13

Bu remove()yöntemi DOM yöntemini kullanarak doğrudan kaldırabilirsiniz .

İşte bir örnek:

let subsWrapper = document.getElementById("element_id");
subsWrapper.remove();
//OR directly.
document.getElementById("element_id").remove();


7

İlk önce ana düğüme gitmem bana biraz garip geliyor, JavaScript'in böyle çalışmasının bir nedeni var mı?

İşlev adı removeChild()ve ebeveyn olmadığında çocuğu kaldırmak nasıl mümkün olabilir? :)

Öte yandan, her zaman gösterdiğiniz gibi aramak zorunda değilsiniz. element.parentNodeyalnızca verilen düğümün üst düğümünü almak için bir yardımcıdır. Üst düğümü zaten biliyorsanız, bunu şu şekilde kullanabilirsiniz:

Ör:

// Removing a specified element when knowing its parent node
var d = document.getElementById("top");
var d_nested = document.getElementById("nested");
var throwawayNode = d.removeChild(d_nested);

https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild

================================================== =======

Daha fazlasını eklemek için:

Bazı cevaplar kullanmak yerine parentNode.removeChild(child);, kullanabileceğinizi belirtti elem.remove();. Ancak fark ettiğim gibi, iki işlev arasında bir fark var ve bu cevaplarda bahsedilmiyor.

Kullanırsanız removeChild(), kaldırılan düğüme bir başvuru döndürür.

var removedChild = element.parentNode.removeChild(element); 
console.log(removedChild); //will print the removed child.

Ama kullanırsanız elem.remove();, size referans döndürmez.

var el = document.getElementById('Example');
var removedChild = el.remove(); //undefined

https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove

Bu davranış, Chrome ve FF'de görülebilir. Fark etmeye değer olduğuna inanıyorum :)

Umarım cevabım soruya biraz değer katar ve yardımcı olacaktır!


6

Ele.parentNode.removeChild (ele) kullanan işlevler, oluşturduğunuz ancak henüz HTML'ye eklenmemiş öğeler için çalışmaz. JQuery ve Prototype gibi kütüphaneler akıllıca aşağıdaki gibi bir yöntem kullanır.

_limbo = document.createElement('div');
function deleteElement(ele){
    _limbo.appendChild(ele);
    _limbo.removeChild(ele);
}

JavaScript'in böyle çalıştığını düşünüyorum çünkü DOM'un orijinal tasarımcıları, bugün çok popüler olan DHTML değişikliklerinden daha yüksek bir öncelik olarak ebeveyn / çocuk ve önceki / sonraki navigasyonu tuttu. Bir <input type = 'text'> öğesinden okuyabilir ve DOM'daki göreceli konuma göre başka bir yazıya yazabilmek, tüm HTML formlarının veya etkileşimli GUI öğelerinin dinamik oluşturulmasının neredeyse hiç parlamadığı 90'lı yılların ortalarında yararlıydı. bazı geliştiricinin gözü.


3

İlk önce ana düğüme gitmem bana biraz garip geliyor, JavaScript'in böyle çalışmasının bir nedeni var mı?

IMHO: Bunun nedeni diğer ortamlarda gördüğümle aynı: Bir şeye "bağlantınıza" dayalı bir eylem gerçekleştiriyorsunuz. Bağlı olduğunuzda silemezsiniz.

Bir ağaç kolunu kesmek gibi. Keserken ağaca en yakın tarafta oturun yoksa sonuç talihsiz olur (komik olmasına rağmen).


2

Bu aslında FireFox'dan geliyor ... bir kez IE paketin önündeydi ve bir elemanın doğrudan kaldırılmasına izin verdi.

Bu sadece benim varsayımım, ancak ebeveynlerden bir çocuğu çıkarmanızın nedeninin FireFox'un referansı işleme biçimindeki bir sorundan kaynaklandığına inanıyorum.

Bir nesneyi doğrudan hari-kari işlemek için çağırırsanız, o zaman öldükten hemen sonra, hala ona referansta bulunuyorsunuz. Bunun birkaç kötü hata yaratma potansiyeli vardır ... kaldırmamak, kaldırmak ama geçerli görünen referansları tutmak veya sadece bir bellek sızıntısı gibi.

Sorunun farkına vardıklarında, etrafındaki çalışmanın bir öğeyi üst öğesi aracılığıyla kaldırmak olduğuna inanıyorum, çünkü öğe gittiğinde, artık yalnızca üst öğeye referansta bulunuyorsunuz. Bu, tüm bu tatsızlığı durduracak ve (örneğin, bir ağaç düğümünü düğümle kapatırsanız) oldukça güzel bir şekilde 'sıkıştırılabilir'.

Kolayca düzeltilebilir bir hata olmalı, ancak web programlamasında diğer birçok şeyde olduğu gibi, sürüm muhtemelen acele edildi, buna yol açtı ... ve bir sonraki sürüm geldiğinde, bunu değiştirecek kadar insan onu kullanıyordu bir grup kodu kırmak için.

Yine, bütün bunlar basitçe benim tahminim.

Bununla birlikte, web programlamanın sonunda tam bir bahar temizliği aldığını, tüm bu garip küçük deyimlerin temizlendiğini ve herkesin aynı kurallarla oynamaya başladığını dört gözle bekliyorum.

Muhtemelen robot hizmetçim ertesi gün bana geri ücretler için dava açtı.


10
Bundan Firefox'un sorumlu olduğundan şüpheliyim. DOM Seviye 1 arayüzününremoveChild bir yöntemidir . Node
Felix Kling


0
// http://javascript.crockford.com/memory/leak.html
// cleans dom element to prevent memory leaks
function domPurge(d) {
    var a = d.attributes, i, l, n;
    if (a) {
        for (i = a.length - 1; i >= 0; i -= 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') {
                d[n] = null;
            }
        }
    }
    a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            domPurge(d.childNodes[i]);
       }
    }
}

function domRemove(id) {
    var elem = document.getElementById(id);
    domPurge(elem);
    return elem.parentNode.removeChild(elem);
}

-3

Komut dosyası hatası olmayan bir öğeyi kaldırmak için en iyi işlev budur:

function Remove(EId)
{
    return(EObj=document.getElementById(EId))?EObj.parentNode.removeChild(EObj):false;
}

Not tutmak EObj=document.getElementById(EId) .

Bu bir eşittir işareti değil == .

öğe EIdvarsa, işlev onu kaldırır, aksi takdirde false değerini döndürür error.


4
Genel bir değişken oluşturur.
bjb568

1
Ayrıca başka bir cevabın en kötü versiyonu , ancak 2 yıl geç.
Emile Bergeron
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.