Javascript - innerHTML olmadan konteyner öğesine HTML ekle


167

İnnerHTML kullanmadan bir kapsayıcı öğeye HTML eklemek için bir yol gerekir. İnnerHTML kullanmak istemememin nedeni şu şekilde kullanıldığında:

element.innerHTML += htmldata

Eski html artı yeni html eklemeden önce tüm html'leri değiştirerek çalışır. Bu iyi değil çünkü gömülü flash videolar gibi dinamik ortamları sıfırlıyor ...

Ben bu şekilde yapabilirdi:

var e = document.createElement('span');
e.innerHTML = htmldata;
element.appendChild(e);

Ancak bu şekilde sorun şu anda istemediğim belgede ekstra span etiketi olmasıdır.

Peki bu nasıl yapılabilir? Teşekkürler!


1
Neden Jquery kullanılmıyor? Ayrıntılı cevabımı aşağıdan kontrol edin. stackoverflow.com/a/50482776/5320562
Loukan ElKadi

Yanıtlar:


102

Bir alternatif vermek için (kullanma DocumentFragmentişe yaramaz gibi görünüyor): Yeni oluşturulan düğümün çocukları üzerinde yineleyerek simüle edebilir ve sadece bunları ekleyebilirsiniz.

var e = document.createElement('div');
e.innerHTML = htmldata;

while(e.firstChild) {
    element.appendChild(e.firstChild);
}

2

1
@kennydelacruz: OP varolan bir HTML'ye yeni HTML eklemek istemedi çünkü mevcut öğeleri yok ediyor ve yeniden oluşturuyor. OP, yeni bir öğe oluşturarak bir çözüm buldu ve bunu ekleyin, ancak ek bir öğe eklemek istemediler. Bu çözümü, mevcut öğeleri etkilemeyen yeni oluşturulan öğeleri taşıyabileceklerini / ekleyebileceklerini göstermek için genişlettim.
Felix Kling

Bu eski olduğunu biliyorum, ama kimse bana neden bir e.firstChild üzerinde yinelenebilir açıklayabilir?
Toastgeraet

1
@Toastgeraet: Bu örnek yineleme değil üzerinde e.firstChild . Daha ziyade, çek olsun ebir çocuğu vardır ve evet eğer hareket elemana üzerinde o çocuğu.
Felix Kling

570

Cevapların hiçbirinin insertAdjacentHTML() yöntemden . Buradan kontrol edin . İlk parametre dizenin eklenmesini istediğiniz yerdir ("beforebegin", "afterbegin", "beforeend", "afterend"). OP durumunda "önce" kullanırsınız. İkinci parametre sadece html dizesidir.

Temel kullanım:

var d1 = document.getElementById('one');
d1.insertAdjacentHTML('beforeend', '<div id="two">two</div>');

53
Sadece çözümünüzü denedim ve kabul edildi. Her ikisi de çalışır, ancak sizinki sadece 2 satır ve döngü yok. Bana bir kazanan gibi geliyor.
Corwin01

3
Bu rotayı seçebilecek herkese referans için: Bu yöntem IE9'daki tablolarla iyi oynamıyor.
Corwin01

2
Chrome'da bana anlatıyor Uncaught TypeError: undefined is not a function!
J86

19
Bu gizli mücevher daha fazla maruz kalma ihtiyacı var.
Seth

Bu yöntemi Düğüm olmayan bir şeyde kullanmaya çalışırsanız hata alırsınız, sadece FYI.
Alex W

15

alnafie'nin bu soru için harika bir cevabı var. Referans için kodunun bir örneğini vermek istedim:

var childNumber = 3;

function addChild() {
  var parent = document.getElementById('i-want-more-children');
  var newChild = '<p>Child ' + childNumber + '</p>';
  parent.insertAdjacentHTML('beforeend', newChild);
  childNumber++;
}
body {
  text-align: center;
}
button {
  background: rgba(7, 99, 53, .1);
  border: 3px solid rgba(7, 99, 53, 1);
  border-radius: 5px;
  color: rgba(7, 99, 53, 1);
  cursor: pointer;
  line-height: 40px;
  font-size: 30px;
  outline: none;
  padding: 0 20px;
  transition: all .3s;
}
button:hover {
  background: rgba(7, 99, 53, 1);
  color: rgba(255,255,255,1);
}
p {
  font-size: 20px;
  font-weight: bold;
}
<button type="button" onclick="addChild()">Append Child</button>
<div id="i-want-more-children">
  <p>Child 1</p>
  <p>Child 2</p>
</div>

Umarım bu başkalarına yardımcı olur.


2
Kurallar için bir stickler olmaktan nefret ediyorum ama bir demo (jsfiddle, codepen, vb.) Oluşturup daha sonra düzenleme özelliğini kullanarak veya yorum göndererek Alnafie'nin cevabına ekleseniz daha iyi olacağını düşünüyorum. Yalnızca başka bir kullanıcının yanıtını göstermek için bir yanıt oluşturmak, sağladığınız bilgilerin ne kadar yararlı olduğuna bakılmaksızın SO'nun nasıl çalıştığı değildir. Her kullanıcının bir cevap oluşturarak başka bir cevap göstermeye karar verip vermediğini düşünün.
Martin James

2
<div id="Result">
</div>

<script>
for(var i=0; i<=10; i++){
var data = "<b>vijay</b>";
 document.getElementById('Result').innerHTML += data;
}
</script>

div için verileri "+ =" simgesiyle atayın, önceki html verilerini içeren verileri ekleyebilirsiniz


11
Soru özellikle gerektirir değil kullanarak element.innerHTML += data.
musicnothing

1

Bunun DocumentFragmentiçindi.

var frag = document.createDocumentFragment();
var span = document.createElement("span");
span.innerHTML = htmldata;
for (var i = 0, ii = span.childNodes.length; i < ii; i++) {
    frag.appendChild(span.childNodes[i]);
}
element.appendChild(frag);

document.createDocumentFragment, .childNodes


Sadece bunu test ettim ve işe yaramıyor. Bu nasıl kullanılmalı?
Bob

Nereden geliyorsun (a)? Bu bir yazım hatası mı?
Ash Burlaczenko

1
Evet bu bir yazım hatası, e olmalı. Bir parça için innerHTML kullanabileceğinizi düşünmüyorum. Bu işe yaramıyor
Bob

@Bob Cop-out kullanımı jQuery için gittim.
Raynos

jQuery hayır hayır! Ben sadece küçük bir işlev için jQuery dahil etmeyeceğim: \ Bu sadece aşırı
Bob

-1

Nasıl balık ve katı kod kullanırken. Bu yazının altında iki önkoşul işlevi vardır.

xml_add('before', id_('element_after'), '<span xmlns="http://www.w3.org/1999/xhtml">Some text.</span>');

xml_add('after', id_('element_before'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

xml_add('inside', id_('element_parent'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

Birden çok öğe ekleyin (ad alanının yalnızca üst öğe üzerinde olması gerekir):

xml_add('inside', id_('element_parent'), '<div xmlns="http://www.w3.org/1999/xhtml"><input type="text" /><input type="button" /></div>');

Dinamik yeniden kullanılabilir kod:

function id_(id) {return (document.getElementById(id)) ? document.getElementById(id) : false;}

function xml_add(pos, e, xml)
{
 e = (typeof e == 'string' && id_(e)) ? id_(e) : e;

 if (e.nodeName)
 {
  if (pos=='after') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e.nextSibling);}
  else if (pos=='before') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  else if (pos=='inside') {e.appendChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true));}
  else if (pos=='replace') {e.parentNode.replaceChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  //Add fragment and have it returned.
 }
}
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.