DOM'a HTML dizesi ekleme


121

Bu HTML dizesi nasıl eklenir

var str = '<p>Just some <span>text</span> here</p>';

DOM'da bulunan kimliğe 'test'sahip DIV'ye?

(Btw div.innerHTML += str;kabul edilmez.)

Yanıtlar:


243

insertAdjacentHTMLVarsa kullanın , aksi takdirde bir çeşit geri dönüş kullanın. insertAdjacentHTML mevcut tüm tarayıcılarda desteklenmektedir .

div.insertAdjacentHTML( 'beforeend', str );

Canlı demo: http://jsfiddle.net/euQ5n/


1
@alex Aynı kavram: bir HTML dizesini ayrıştırmak ve DOM'a koymak. Ancak işlevsellik farklıdır - innerHTMLdizeyi öğeye yerleştirir (tüm alt öğeleri değiştirir), oysa insertAdjacentHTML(1) öğeden önce, (2) öğeden sonra, (3) öğenin içine ilk alt öğeden önce veya (4) son çocuktan sonra elemanın içinde.
Šime Vidas

3
@alex insertAdjacentHTML, öğeye eklemekten daha hızlıdır innerHTML, çünkü insertAdjacentHTMLöğenin mevcut alt öğelerini serileştirmez ve yeniden ayrıştırmaz.
hsivonen

2
Ayrıca, insertAdjacentHTMLdeğiştirilen form öğelerinin değerlerini korurken, ekleme innerHTML, öğeyi yeniden oluşturur ve tüm form bağlamını kaybeder.
Brandon Gano

20

Bu kabul edilebilir mi?

var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);

jsFiddle .

Ama , Neil'in cevabı daha iyi bir çözümdür.


1
@ Šime DOM API ile çalışmak her zaman bir hile gibi geliyor: P Dizeyi olmadan seri hale getirmeyi tercih eder miydiniz innerHTML?
alex

Evet, tarayıcının HTML ayrıştırıcısını kullanmanın başka bir yolu varsa, bilmek isterim ...
Šime Vidas

1
@ Šime - Tarayıcının HTML ayrıştırıcısını kullanmanın yalnızca iki yolu olduğunu düşünüyorum, innerHTML ve document.write. Ve innerHTML'nin bir hack olduğunu düşünüyorsan ...
Alohci

@Alohci Orada olan başka bir yol: insertAdjacentHTML.
Šime Vidas

1
@ Šime -Teşekkürler. WHATWG sürümünü buldum. Bu öyle DOM Ayrıştırma ve Serileştirme spec. Bu, innerHTML ve insertAdjacentHTML'in yanı sıra, externalHTML olduğunu ve bence createContextualFragment olduğunu gösterir.
Alohci

16

Verim

AppendChild(E) krom ve safarideki diğer çözümlerden 2 kat daha hızlıdır, insertAdjacentHTML(F) firefox'ta en hızlısıdır. innerHTML=(B) (ile değil şaşırtmak do +=) A () tüm tarayıcılarda ikinci hızlı bir çözümdür ve E ve F çok daha kullanışlı

ayrıntılar

Chrome 75.0.3770 (64-bit), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64-bit) üzerinde ortam kurma (2019.07.10) MacOs High Sierra 10.13.4

görüntü açıklamasını buraya girin

  • Chrome E'de (saniyede 140 bin işlem) en hızlı, B (47k) ve F (46k) ikinci, A (332) en yavaş
  • firefox'ta F (94k) en hızlı, sonra B (80k), D (73k), E (64k), C (21k) en yavaş A (466)
  • Safari'de E (207k) en hızlısı, sonra B (89k), F (88k), D (83k), C (25k), en yavaş A (509)

Burada makinenizde testi tekrar oynayabilirsiniz


12

Buradaki fikir, innerHTMLbir aracı öğe üzerinde kullanmak ve ardından tüm alt düğümlerini gerçekten istediğiniz yere taşımaktır appendChild.

var target = document.getElementById('test');
var str = '<p>Just some <span>text</span> here</p>';

var temp = document.createElement('div');
temp.innerHTML = str;
while (temp.firstChild) {
  target.appendChild(temp.firstChild);
}

Bu, herhangi bir olay işleyicisinin silinmesini önler, div#testancak yine de bir HTML dizesi eklemenize izin verir.


3

Doğru yol kullanmaktır insertAdjacentHTML. Daha önce 8'den Firefox'ta, kullanmakta geri düşebilir Range.createContextualFragmentsenin eğer strhiçbir içeriyor scriptetiketleri.

Eğer senin striçeren scriptetiketler, kaldırmak gerekir scripttarafından döndürülen parçasından elemanları createContextualFragmentfragman takmadan önce. Aksi takdirde, betikler çalışacaktır. ( insertAdjacentHTMLkomut dosyalarını yürütülemez olarak işaretler.)


Bahsettiğiniz için teşekkür ederim createContextualFragment . Yalnızca kullanıcı bir çerez ayarlamayı kabul ederse, komut dosyalarıyla birlikte bazı html içermelerini çalıştırmanın bir yolunu arıyordum.
schliflo

3

Hızlı Hack :


<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>

Kullanım Durumları :

1: .html dosyası olarak kaydedin ve chrome veya firefox veya edge'de çalıştırın. (IE işe yaramaz)

2: http : //js.do'da kullanın

Eylemde: http://js.do/HeavyMetalCookies/quick_hack

Yorumlarla ayrıldı:

<script>

//: The message "QUICK_HACK" 
//: wrapped in a header #1 tag.
var text = "<h1>QUICK_HACK</h1>";

//: It's a quick hack, so I don't
//: care where it goes on the document,
//: just as long as I can see it.
//: Since I am doing this quick hack in
//: an empty file or scratchpad, 
//: it should be visible.
var child = document.children[0];

//: Set the html content of your child
//: to the message you want to see on screen.
child.innerHTML = text;

</script>

Yayınlamamın Nedeni:

JS.do'nun sahip olması gereken iki şey vardır:

  1. Otomatik tamamlama yok
  2. Dikey monitör dostu

Ancak console.log mesajlarını göstermez. Hızlı bir çözüm bulmak için buraya geldim. Sadece birkaç satırlık kazı kazan kodunun sonuçlarını görmek istiyorum, diğer çözümler çok fazla iş.


1

Bu neden kabul edilemez?

document.getElementById('test').innerHTML += str

bunu yapmanın ders kitabı yolu olurdu.


4
Yine de bağlı olan olay işleyicilerini öldürür#test . Bu genellikle arzu edilen bir durum değildir.
alex

Bunu yapması ilginç. Gerçekten mantıklı görünmüyor.
Nick Brunt

2
HTML'nin bir dizeye serileştirilmesini ve ardından HTML'yi geri ayarlamayı düşünürseniz mantıklıdır.
alex

Sanırım olay işleyicisini sıfırlamak için JavaScript'in yeniden çalıştırılması gerekecekti. Yeterince adil.
Nick Brunt

1
@Nick DOM'un bir bölümünü dizgileştirmek (serileştirmek) istemezsiniz, böylece onu başka bir dizeyle birleştirebilir ve ardından tüm şeyi tekrar DOM'a ayrıştırabilirsiniz. Alex'in dediği gibi, serileştirme bağlı olay işleyicilerini kaydetmez (diğer şeylerin yanı sıra). Serileştirme her şeyi yakalayabilse bile, yine de yapmak istemezsiniz.
Šime Vidas

0

Bu çözebilir

 document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');

3
Stack overflow'a hoş geldiniz. Lütfen kodunuzu, tek bir uzun kod satırı yapıştırmak yerine, biraz bağlam sağlamak için bir yanıtın parçası olarak açıklayın. Siz anlasanız bile, diğerleri ne yaptığını anlamayabilir.
credit.burger

0

InnerHTML, mevcut düğümler için olay gibi tüm verileri temizler

firstChild ile alt öğe eklemek, yalnızca ilk çocuğu innerHTML'ye ekler. Örneğin, eklememiz gerekirse:

 <p>text1</p><p>text2</p>

sadece metin1 görünecek

Peki buna ne dersin:

İç HTML'ye child ekleyerek özel etiket ekler ve ardından oluşturduğumuz etiketi silerek dış HTML'yi düzenler. Ne kadar akıllı olduğunu bilmiyorum ama benim için çalışıyor ya da externalHTML'yi innerHTML'ye çevirebilirsin, böylece işlev değiştirmeyi kullanmak zorunda kalmaz

function append(element, str)
{

  var child = document.createElement('someshittyuniquetag');
		
  child.innerHTML = str;

  element.appendChild(child);

  child.outerHTML = child.outerHTML.replace(/<\/?someshittyuniquetag>/, '');

// or Even child.outerHTML = child.innerHTML


  
}
<div id="testit">
This text is inside the div
<button onclick="append(document.getElementById('testit'), '<button>dadasasdas</button>')">To div</button>
<button onclick="append(this, 'some text')">to this</button>
</div>


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.