JavaScript'teki bir DOM düğümünün tüm alt öğelerini kaldırma


873

JavaScript'teki bir DOM düğümünün alt öğelerinin tümünü kaldırmaya nasıl giderim?

Diyelim ki (çirkin) HTML kodum var:

<p id="foo">
    <span>hello</span>
    <div>world</div>
</p>

Ve istediğim düğümü alıyorum:

var myNode = document.getElementById("foo");

Çocukları nasıl kaldırabilirim fooki <p id="foo"></p>geriye bırakılır?

Sadece yapabilir miyim:

myNode.childNodes = new Array();

ya da bir kombinasyonunu kullanmalı removeElementmıyım?

Cevabın doğrudan DOM olmasını istiyorum; ancak jQuery'de yalnızca DOM yanıtıyla birlikte bir yanıt da sağlarsanız ekstra puanlar.

Yanıtlar:


1674

Seçenek 1 A: Temizleme innerHTML.

  • Bu yaklaşım basittir, ancak tarayıcının HTML ayrıştırıcısını çağırdığı için yüksek performanslı uygulamalar için uygun olmayabilir (tarayıcılar değerin boş bir dize olduğu durum için optimize edebilir ).

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  myNode.innerHTML = '';
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via innerHTML</button>

Seçenek 1 B: Temizleme textContent

  • Yukarıdaki gibi, ama kullanın .textContent. MDN'ye göre bu, innerHTMLtarayıcıların HTML ayrıştırıcılarını çağırmayacağı ve bunun yerine öğenin tüm alt öğelerini hemen tek bir #textdüğümle değiştireceğinden daha hızlı olacaktır .

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  myNode.textContent = '';
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via textContent</button>

Seçenek 2 A: Her birini çıkarmak için döngü lastChild:

  • Bu cevapta daha önce yapılan bir düzenleme kullanıldı firstChild, ancak bu lastChildbilgisayar bilimlerinde olduğu gibi güncellendi , genel olarak , bir koleksiyonun son öğesini kaldırmak, ilk öğeyi kaldırmaktan (koleksiyonun nasıl uygulandığına bağlı olarak) çok daha hızlıdır. ).
  • Döngü için kontrol etmeye devam firstChild ihtimale karşı bunun kontrol etmek için daha hızlı firstChilddaha lastChild(örn eleman listesi UA tarafından yönlendirilmiş bağlantılı liste olarak uygulanıyor ise).

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  while (myNode.firstChild) {
    myNode.removeChild(myNode.lastChild);
  }
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via lastChild-loop</button>

Seçenek 2 B: Aşağıdakileri çıkarmak için döngü lastElementChild:

  • Bu yaklaşım , ebeveynin tüm Element(yani #textdüğümleri ve olmayan <!-- comments -->) çocuklarını (torunlarını değil) korur - ve bu, uygulamanızda istenebilir (örneğin, şablon talimatlarını saklamak için satır içi HTML yorumları kullanan bazı şablonlama sistemleri).
  • Internet Explorer yalnızca lastElementChildIE9 için destek eklediğinden, bu yaklaşım son yıllara kadar kullanılmadı .

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  while (myNode.lastElementChild) {
    myNode.removeChild(myNode.lastElementChild);
  }
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <!-- This comment won't be removed -->
  <span>Hello <!-- This comment WILL be removed --></span>
  <!-- But this one won't. -->
</div>
<button id='doFoo'>Remove via lastElementChild-loop</button>

Bonus: Element.clearChildrenmaymun yaması:

  • ElementJavaScript'teki prototipe sadece el.clearChildren()( herhangi bir HTML öğesi nesnesinin nerede elolduğu) çağrılmasını basitleştirmek için yeni bir yöntem özelliği ekleyebiliriz .
  • (Açıkça söylemek gerekirse, bu standart bir DOM özelliği veya eksik bir özellik olmadığından, bir çoklu dolgu değil, bir maymun yamasıdır. Maymun yamalamanın birçok durumda haklı olarak cesaret kırıldığını unutmayın.)

if( typeof Element.prototype.clearChildren === 'undefined' ) {
    Object.defineProperty(Element.prototype, 'clearChildren', {
      configurable: true,
      enumerable: false,
      value: function() {
        while(this.firstChild) this.removeChild(this.lastChild);
      }
    });
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello <!-- This comment WILL be removed --></span>
</div>
<button onclick="this.previousElementSibling.clearChildren()">Remove via monkey-patch</button>


6
JQuery'den bu iki sorun dikkate alınabilir: Bu yöntem yalnızca alt (ve diğer alt öğeleri) öğeleri değil, aynı zamanda eşleşen öğeler kümesindeki herhangi bir metni de kaldırır. Bunun nedeni, DOM belirtimine göre, bir öğedeki herhangi bir metin dizesinin o öğenin alt düğümü olarak kabul edilmesidir. AND "Bellek sızıntılarını önlemek için, jQuery, veri ve olay işleyicileri gibi diğer yapıları, öğelerin kendisini kaldırmadan önce alt öğelerden kaldırır."
jottos

104
Btw, lastChild kullanmak biraz daha etkili gibi görünüyor jsperf.com/innerhtml-vs-removechild/15
Andrey Lushnikov

24
innerHTML yalnızca HTML ile uğraşıyorsanız çalışır. Örneğin içinde sadece SVG varsa Eleman kaldırma işe yarayacaktır
stwissel

34
ASLA ASLA innerHTML = '' kullanmayın. Yapma. Sorun, öğelerin kaldırıldıkları gibi görünmesi, ancak dahili olarak, düğümlerin devam etmesi ve işleri yavaşlatmasıdır. Bir sebepten dolayı tüm ayrı düğümleri kaldırmanız gerekir. Hem Google Chrome'da hem de IE'de test edildi. Lütfen yanlış olduğundan innerHTML "çözümünü" kaldırmayı düşünün.
Kenji

15
@vsync Kenji'nin yorumunun sağlam olduğuna inanmıyorum. Yapmak innerHTML = ''daha yavaş, ama bunun "yanlış" olduğunu düşünmüyorum. Bellek sızıntısı iddiaları kanıtlarla desteklenmelidir.
Chris Middleton

115

Şu anda kabul edilen cevap, innerHTMLm93a'nın doğru şekilde belirtildiği gibi, daha yavaş (en azından IE ve Chrome'da) olma konusunda yanlıştır .

Chrome ve FF, bu yöntemi kullanarak (ekli jquery verilerini yok edecek) önemli ölçüde daha hızlıdır:

var cNode = node.cloneNode(false);
node.parentNode.replaceChild(cNode, node);

FF ve Chrome için uzak saniyede ve IE'de en hızlı:

node.innerHTML = '';

InnerHTML , etkinlik işleyicilerinizi yok etmez veya jquery referanslarını kesmez , ayrıca burada bir çözüm olarak önerilmektedir: https://developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML .

En hızlı DOM manipülasyon yöntemi (hala önceki ikisinden daha yavaştır) Aralık kaldırmadır, ancak IE9'a kadar aralıklar desteklenmez.

var range = document.createRange();
range.selectNodeContents(node);
range.deleteContents();

Bahsedilen diğer yöntemler karşılaştırılabilir gibi görünebilir, ancak outHT, jquery (1.1.1 ve 3.1.1) dışında, her şeyden önemli ölçüde daha yavaş olan innerHTML'den çok daha yavaştır:

$(node).empty();

Kanıt burada:

http://jsperf.com/innerhtml-vs-removechild/167 http://jsperf.com/innerhtml-vs-removechild/300 https://jsperf.com/remove-all-child-elements-of-a- dom-node-in-javascript (Eski url'yi düzenlemek çalışmadığı için jsperf yeniden başlatma için yeni url)

Jsperf'in "test başına döngü" genellikle "yineleme başına" olarak anlaşılır ve yalnızca ilk yinelemenin kaldırılacak düğümleri vardır, bu nedenle sonuçlar anlamsızdır, gönderme sırasında bu iş parçacığında yanlış ayarlanmış testler vardı.


2
Jsperf'iniz tamamen bozuldu. Bu çok iyi bir kanıt değil.
bryc

4
Bu şu anda en iyi cevap. Bu konudaki diğer her şey dezenformasyon (!) Bu kötü eski testleri temizlediğiniz için teşekkürler.
Ben

6
"InnerHTML olay işleyicilerinizi yok etmeyecek veya herhangi bir jquery referansını bozmayacaktır" Bu veriyi jQuery.cacheyönetmek için mevcut olan tek referans az önce yok ettiğiniz öğeler üzerindeyken bir bellek sızıntısına neden olacak şekilde, artık yetim kalmayacak .

1
"InnerHTML olay işleyicilerinizi yok etmeyecek veya herhangi bir jquery referansını bozmayacak", kapsayıcıya değil, çocuklara yöneliktir. cloneNodekonteyneri kapatır, yani konteynere yapılan referanslar korunmaz (jquery veya başka türlü). Jquery'nin önbelleği, bağlı jquery verileriniz varsa öğeleri kaldırmak için jquery kullanmaya değer olabilir. Umarım bir noktada WeakMaps'e geçerler . $ .Cache dosyasının temizlenmesi (hatta varlığı) resmi olarak belgelenmemiş gibi görünüyor.
npjohns

10
Jsperf testleri burada kırılmıştır. Test motoru aşağıdakileri bildirir: "Hata: Yineleme sırasında Dom düğümleri yeniden oluşturulmadı, test sonuçları anlamsız olacak."
senderle

73

İle modern Javascript kullanın remove!

const parent = document.getElementById("foo");
while (parent.firstChild) {
    parent.firstChild.remove();
}

Bu, ES5'te düğüm kaldırma işlemini yazmanın daha yeni bir yoludur. Vanilla JS ve önceki sürümlerden çok daha güzel okuyor .

Çoğu kullanıcı modern tarayıcılara sahip olmalıdır, aksi takdirde gerektiğinde aktarım yapabilirsiniz.

Tarayıcı Desteği -% 95 Ara 2019


14
Parent.children / parent.childNodes canlı listeler olduğundan for döngüsü çalışmaz; remove komutunun çağrılması listeyi değiştirir ve bu nedenle yineleyicinizin her şeyi yinelemesi garanti edilmez. Kromda, örneğin, diğer tüm düğümleri atlarsınız. Bir while (parent.firstChild) { parent.removeChild(parent.firstChild); }döngü kullanmak daha iyidir. developer.mozilla.org/en-US/docs/Web/API/ParentNode/children developer.mozilla.org/en-US/docs/Web/API/Node/childNodes
qix

3
Daha az okunabilir olmasına rağmen serin stenografi:while (parent.firstChild && !parent.firstChild.remove());
Gibolt

1
Performans büyük bir anlaşma olmadığı zamanlar için bir astar:[...parent.childNodes].forEach(el => el.remove());

1
Bu daktiloda çalışmaz ... bunun yerine kullanımwhile (selectElem.firstElementChild) { selectElem.firstElementChild.remove(); }
John Henckel

43
var myNode = document.getElementById("foo");
var fc = myNode.firstChild;

while( fc ) {
    myNode.removeChild( fc );
    fc = myNode.firstChild;
}

JQuery'den etkilenen torunlarınız varsa, jQuery verilerini temizleyecek bir yöntem kullanmanız gerekir .

$('#foo').empty();

JQuery .empty()yöntemi , kaldırılmakta olan öğelerle ilişkili jQuery verilerinin temizlenmesini sağlar.

Yalnızca DOMçocukları kaldırma yöntemlerini kullanırsanız , bu veriler kalır.


İnnerHTML yöntemi açık arayla en başarılı yöntemdir. Bununla birlikte, jquery'nin .empty () ile temizlenen veriler: Yinelemeli bir döngü kullanarak alt etiketlerle ilişkili jquery içindeki verileri () ortadan kaldırır (yavaş, ancak bellek kullanımını önemli ölçüde azaltabilir), jquery .onclick = ... kullanmak gibi. Kaldırılacak çocuklarda böyle bir olay yoksa, innerHTML ayarı sızmaz. Yani en iyi cevap - duruma göre değişir.
Chris Moschini

1
Neden firstChild ifadesini doğrudan while döngüsünün durumuna koymuyorsunuz? while ( myNode.firstChild ) {
Victor Zamanian

while(fc = myNode.firstChild){ myNode.removeChild(fc); }
Valen

36

JQuery kullanıyorsanız:

$('#foo').empty();

Yapmazsanız:

var foo = document.getElementById('foo');
while (foo.firstChild) foo.removeChild(foo.firstChild);

20

En hızlı...

var removeChilds = function (node) {
    var last;
    while (last = node.lastChild) node.removeChild(last);
};

Andrey Lushnikov'a jsperf.com (serin site!) Bağlantısı için teşekkürler .

EDIT: Net olmak gerekirse, Chrome'da firstChild ve lastChild arasında performans farkı yoktur. Üst yanıt performans için iyi bir çözüm göstermektedir.


LINT uyarısı olmadan aynı şey: clear: function (container) {for (;;) {var child = container.lastChild; (! çocuk) kırılırsa; container.removeChild (çocuk); }}
cskwg

9

Düğümün yalnızca çocukları olmadan olmasını istiyorsanız, bunun bir kopyasını da şöyle yapabilirsiniz:

var dupNode = document.getElementById("foo").cloneNode(false);

Neyi başarmaya çalıştığınıza bağlıdır.


3
Belki bunu bile takip edebilirsin parent.replaceChild(cloned, original)? Bu, çocukları tek tek kaldırmaktan daha hızlı olabilir ve DOM'u destekleyen her şey üzerinde çalışmalıdır (SVG dahil her tür XML belgesi). İnnerHTML ayarı, çocukları tek tek kaldırmaktan daha hızlı olabilir, ancak bu HTML dokümanları dışında hiçbir şeyde işe yaramaz. Bunu bir süre test etmeliyiz.
Maarten

13
Bu, kullanılarak eklenen etkinlik dinleyicilerini kopyalamaz addEventListener.
Matthew

Bu sınırlama ile yaşayabiliyorsanız, kesinlikle hızlıdır: jsperf.com/innerhtml-vs-removechild/137
DanMan

7

İşte başka bir yaklaşım:

function removeAllChildren(theParent){

    // Create the Range object
    var rangeObj = new Range();

    // Select all of theParent's children
    rangeObj.selectNodeContents(theParent);

    // Delete everything that is selected
    rangeObj.deleteContents();
}

1
Bu ilginç, ancak diğer yöntemlere kıyasla oldukça yavaş görünüyor: jsperf.com/innerhtml-vs-removechild/256
Polaris878

6
element.textContent = '';

Standart hariç innerText gibi. Bu var biraz daha yavaş daha removeChild()ama kullanımı daha kolay ve silmek çok fazla şeyler yoksa pek bir performans farkı yapmayacağız.


Metin düğümü bir öğe değil
check_ca 23:14

üzgünüm haklısın, gerçekten de tüm çocuk elemanlarını
kaldırıyor

Bu, Internet Explorer'ın eski sürümlerinde çalışmaz.
pwdst

4

DanMan, Maarten ve Matt'e yanıt olarak. Metni ayarlamak için bir düğümü klonlamak, sonuçlarımda gerçekten geçerli bir yoldur.

// @param {node} node
// @return {node} empty node
function removeAllChildrenFromNode (node) {
  var shell;
  // do not copy the contents
  shell = node.cloneNode(false);

  if (node.parentNode) {
    node.parentNode.replaceChild(shell, node);
  }

  return shell;
}

// use as such
var myNode = document.getElementById('foo');
myNode = removeAllChildrenFromNode( myNode );

Ayrıca bu, parentNode'a erişmeye çalışırken null döndüren dom'da olmayan düğümler için de çalışır. Ayrıca, güvenli olmanız gerekiyorsa, içerik eklemeden önce bir düğümün boş olması gerçekten yararlıdır. Alttaki kullanım durumunu düşünün.

// @param {node} node
// @param {string|html} content
// @return {node} node with content only
function refreshContent (node, content) {
  var shell;
  // do not copy the contents
  shell = node.cloneNode(false);

  // use innerHTML or you preffered method
  // depending on what you need
  shell.innerHTML( content );

  if (node.parentNode) {
    node.parentNode.replaceChild(shell, node);
  }

  return shell;
}

// use as such
var myNode = document.getElementById('foo');
myNode = refreshContent( myNode );

Bir öğenin içindeki bir dizeyi değiştirirken bu yöntemi çok yararlı buluyorum, düğümün ne içereceğinden emin değilseniz, karışıklığı nasıl temizleyeceğinizi düşünmek yerine, yeni başlayın.


3
en kötü şey. orijinal düğümü klonuyla değiştiriyorsanız, orijinal düğüme olan başvuruyu kaybedersiniz. olay işleyicilerin ve diğer bağlantıların hiçbiri çalışmaz.
Arun Aravind

4

Genelde yaptığım şey:

HTMLElement.prototype.empty = function() {
    while (this.firstChild) {
        this.removeChild(this.firstChild);
    }
}

Ve voila, daha sonra herhangi bir dom öğesini aşağıdakilerle boşaltabilirsiniz:

anyDom.empty()

Bu çözümü seviyorum! Herhangi bir nedenle bu boş bir dizeye innerHTML ayarlama üzerinde kullanmalıyım?
TheCodenator

performans: domEl.innerHTML = ""fakir ve kötü uygulama olarak kabul edilir
Ado Ren

3

Bunu başarmak için birkaç seçenek vardır:

En hızlı ():

while (node.lastChild) {
  node.removeChild(node.lastChild);
}

Alternatifler (daha yavaş):

while (node.firstChild) {
  node.removeChild(node.firstChild);
}

while (node.hasChildNodes()) {
  node.removeChild(node.lastChild);
}

Önerilen seçeneklerle kıyaslama


3
var empty_element = function (element) {

    var node = element;

    while (element.hasChildNodes()) {              // selected elem has children

        if (node.hasChildNodes()) {                // current node has children
            node = node.lastChild;                 // set current node to child
        }
        else {                                     // last child found
            console.log(node.nodeName);
            node = node.parentNode;                // set node to parent
            node.removeChild(node.lastChild);      // remove last node
        }
    }
}

Bu, öğedeki tüm düğümleri kaldıracaktır.


... çünkü gereksiz bir karmaşıktır ve nasıl çalıştığına dair bir açıklama yapılmamıştır (ki bu aslında açık değildir), sanırım.
Periata Breatta

2

innerText kazanır! http://jsperf.com/innerhtml-vs-removechild/133 . Önceki tüm testlerde ana düğümün iç domu ilk tekrarlamada ve daha sonra boş div'e uygulandığında innerHTML veya removeChild silinmiştir.


5
innerTextolsa da tescilli bir MS şeydir. Sadece söylüyorum.
DanMan

1
Bunun kusurlu bir test olduğundan eminim - boxbir var olarak değil, kimliğe dayalı DOM araması ile kullanılabilir ve whiledöngü bu yavaş aramayı birçok kez cezalandırıldığından.
nrabinowitz

2

Bir düğümün alt düğümlerini Javascript aracılığıyla kaldırmanın en basit yolu

var myNode = document.getElementById("foo");
while(myNode.hasChildNodes())
{
   myNode.removeChild(myNode.lastChild);
}

2

insanların yaptığını gördüm:

while (el.firstNode) {
    el.removeChild(el.firstNode);
}

sonra birisi kullanmanın el.lastNodedaha hızlı olduğunu söyledi

Ancak bunun en hızlı olduğunu düşünürdüm:

var children = el.childNodes;
for (var i=children.length - 1; i>-1; i--) {
    el.removeNode(children[i]);
}

ne düşünüyorsun?

ps: bu konu benim için hayat kurtarıcıydı. benim firefox addon reddedildi çünkü innerHTML kullandım. Uzun zamandır bir alışkanlıktı. sonra bunu kandırdım. ve aslında bir hız farkı fark ettim. yükte innerhtml güncelleme biraz zaman aldı, ancak addElement anında gidiyor!


1
en hızlı olup olmadığını düşünüyorum, bazı jsperf testleri her iki durumda da kanıtlayabilir
Nikos M.

süper iş bu testler için teşekkürler. onlar for (var i=0...olsa bir dahil değildir. Ama ben bu testleri çalıştırdığımda aldım: i.imgur.com/Mn61AmI.png Bu üç testte firstNode, gerçek düğüm olan lastNode ve innerHTML'den daha hızlıydı
Noitidart

testleri ekledim: jsperf.com/innerhtml-vs-removechild/220 el.firstNode yöntemini yapmak ilginç şeyler göründüğü en hızlı yoldur
Noitidart

2

Range loop kullanmak benim için en doğal olanı:

for (var child of node.childNodes) {
    child.remove();
}

Chrome ve Firefox'taki ölçümlerime göre, yaklaşık 1,3 kat daha yavaş. Normal koşullarda, bu belki de önemli olmayacaktır.


2
 let el = document.querySelector('#el');
 if (el.hasChildNodes()) {
      el.childNodes.forEach(child => el.removeChild(child));
 }

1
Lütfen kodunuzun ne yaptığını açıklayınız.
Nirav Joshi

1
Kendini açıklayıcı
blacksheep

1

Genellikle JavaScript, DOM düğümlerinin listelerine başvurmak için diziler kullanır. Bu nedenle, HTMLElements dizisi aracılığıyla yapmakla ilgileniyorsanız, bu iyi çalışır. Ayrıca, dikkat çekmeye değer, çünkü JavaScript proto yerine bir dizi başvurusu kullanıyorum bu IE dahil herhangi bir tarayıcıda çalışması gerekir.

while(nodeArray.length !== 0) {
  nodeArray[0].parentNode.removeChild(nodeArray[0]);
}

1

Neden burada en basit yöntemi takip etmiyoruz "loop" içeride ilmekledi.

const foo = document.querySelector(".foo");
while (foo.firstChild) {
  foo.firstChild.remove();     
}
  • Üst div öğesini seçme
  • İlk alt öğeyi ortadan kalmayıncaya kadar ortadan kaldırmak için While döngüsünde "remove" yöntemini kullanma.

Diğer kullanıcıların işlevlerini anlayabilmesi için lütfen kod satırlarınızı açıklayın. Teşekkürler!
Ignacio Ara

@IgnacioAra Tamamlandı!
Neelansh Verma

1

Sadece birisi başka bir soru bu soruyu söyledi ve henüz görmedim bir yöntem eklemek düşündüm:

function clear(el) {
    el.parentNode.replaceChild(el.cloneNode(false), el);
}

var myNode = document.getElementById("foo");
clear(myNode);

Clear işlevi, öğeyi alıyor ve üst düğümü, kendisini çocuksuz bir kopyayla değiştirmek için kullanıyor. Eleman seyrek ise çok fazla performans kazanımı olmaz, ancak eleman bir grup düğüme sahip olduğunda performans kazançları gerçekleşir.


1
Aslında burada bahsedildi gibi görünüyor stackoverflow.com/a/15441725/576767
Félix Gagnon-Grenier

Felix bunu kaçırmış olmalıyım, düzeltme +1 için teşekkürler.
Harry Chilinguerian

1

Yalnızca işlevsel yaklaşım:

const domChildren = (el) => Array.from(el.childNodes)
const domRemove = (el) => el.parentNode.removeChild(el)
const domEmpty = (el) => domChildren(el).map(domRemove)

domChildren içindeki "childNodes", hemen bulunmayan öğelerden bir nodeList öğesi verecektir; bu, hiçbiri bulunmadığında boştur. NodeList üzerinden eşlemek için domChildren onu diziye dönüştürür. domEmpty, domRemove işlevini kaldıran tüm öğeler üzerinde bir işlev eşler.

Örnek kullanım:

domEmpty(document.body)

tüm çocukları vücut elemanından kaldırır.


0

JQuery'deki diğer yollar

var foo = $("#foo");
foo.children().remove();
//or
$("*", foo ).remove();
//or
foo.html("");
//or
foo.empty();

Aşağı oylama, çünkü OP'nin düz DOM'daki cevapların tercih edildiğini söyledi.
bwindels

Ayrıca, jQuery .empty()yöntemi vardır, sadece $("#foo").empty()yeterli olurdu
YakovL

-1

sadece IE:

parentElement.removeNode(true);

true - derinlemesine kaldırma anlamına gelir - yani tüm çocuklar da çıkarılır


1
IE? Bu 21. yüzyıl!
everlasto

-1

En kolay yol:

let container = document.getElementById("containerId");
container.innerHTML = "";

Bu çalışırken, container.innerHTML = nullInternet Explorer'ın metni görüntülemesine dikkat edin null. Yani, bu gerçekten çocukları kaldırmaz, diyebilirim.
Arjan

-1

döngü için kullanarak basit ve hızlı !!

var myNode = document.getElementById("foo");

    for(var i = myNode.childNodes.length - 1; i >= 0; --i) {
      myNode.removeChild(myNode.childNodes[i]);
    }

bu <span>etikette çalışmaz !


Tüm solüsyon yukarıdaki hiçbir kod kaldırıyor <span>etiketi
Mohit karkar

-3

Bunun içine bir şey geri koymak istiyorsanız div, innerHTMLmuhtemelen daha iyidir.

Örneğim:

<ul><div id="result"></div></ul>

<script>
  function displayHTML(result){
    var movieLink = document.createElement("li");
    var t = document.createTextNode(result.Title);
    movieLink.appendChild(t);
    outputDiv.appendChild(movieLink);
  }
</script>

.firstChildVeya .lastChildyöntemini kullanırsam displayHTML()işlev daha sonra çalışmaz, ancak .innerHTMLyöntemle ilgili bir sorun yoktur .


-4

Bu saf javascript i jQuery kullanmıyorum ama IE bile tüm tarayıcıda çalışır ve anlamak çok basit

   <div id="my_div">
    <p>Paragraph one</p>
    <p>Paragraph two</p>
    <p>Paragraph three</p>
   </div>
   <button id ="my_button>Remove nodes ?</button>

   document.getElementById("my_button").addEventListener("click",function(){

  let parent_node =document.getElemetById("my_div"); //Div which contains paagraphs

  //Let find numbers of child inside the div then remove all
  for(var i =0; i < parent_node.childNodes.length; i++) {
     //To avoid a problem which may happen if there is no childNodes[i] 
     try{
       if(parent_node.childNodes[i]){
         parent_node.removeChild(parent_node.childNodes[i]);
       }
     }catch(e){
     }
  }

})

or you may simpli do this which is a quick way to do

document.getElementById("my_button").addEventListener("click",function(){

 let parent_node =document.getElemetById("my_div");
 parent_node.innerHTML ="";

})

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.