Javascript - Tambahkan HTML ke elemen penampung tanpa innerHTML

167

Saya perlu cara untuk menambahkan HTML ke elemen wadah tanpa menggunakan innerHTML. Alasan mengapa saya tidak ingin menggunakan innerHTML adalah karena ketika digunakan seperti ini:

element.innerHTML += htmldata

Ini bekerja dengan mengganti semua html terlebih dahulu sebelum menambahkan html lama ditambah html baru. Ini tidak baik karena mengatur ulang media dinamis seperti video flash yang tertanam ...

Saya bisa melakukannya dengan cara ini:

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

Namun masalah dengan cara itu adalah bahwa ada tag rentang ekstra dalam dokumen sekarang yang tidak saya inginkan.

Bagaimana ini bisa dilakukan? Terima kasih!

Bob
sumber
1
Mengapa tidak menggunakan Jquery? Lihat jawaban terinci saya di bawah ini. stackoverflow.com/a/50482776/5320562
Loukan ElKadi

Jawaban:

102

Untuk memberikan alternatif (seperti menggunakan DocumentFragmenttampaknya tidak berhasil): Anda dapat mensimulasikannya dengan mengulangi anak-anak dari simpul yang baru dibuat dan hanya menambahkannya.

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

while(e.firstChild) {
    element.appendChild(e.firstChild);
}
Felix Kling
sumber
2
Saya pikir kami sedang mencari solusi yang tidak menggunakan "innerHTML"
kennydelacruz
1
@kennydelacruz: OP tidak ingin menambahkan HTML baru ke HTML yang sudah ada karena ia menghancurkan dan membuat ulang elemen yang ada. OP menemukan solusi dengan membuat elemen baru dan menambahkannya, tetapi mereka tidak ingin menambahkan elemen tambahan. Saya baru saja memperluas solusi untuk menunjukkan bahwa mereka dapat memindahkan / menambahkan elemen yang baru dibuat, yang tidak berdampak pada elemen yang ada.
Felix Kling
Saya tahu ini sudah tua, tetapi adakah yang bisa menjelaskan kepada saya mengapa orang bisa beralih dari e.firstChild?
Toastgeraet
1
@Toastgeraet: Ini adalah contoh yang belum berulang e.firstChild . Sebaliknya, ia memeriksa apakah ememiliki anak dan jika ya, pindahkan anak itu ke elemen.
Felix Kling
570

Saya terkejut bahwa tidak ada jawaban yang menyebutkan insertAdjacentHTML()metode ini. Lihat di sini . Parameter pertama adalah di mana Anda ingin string ditambahkan dan mengambil ("beforebegin", "afterbegin", "beforeend", "afterend"). Dalam situasi OP Anda akan menggunakan "beforeend". Parameter kedua hanyalah string html.

Penggunaan dasar:

var d1 = document.getElementById('one');
d1.insertAdjacentHTML('beforeend', '<div id="two">two</div>');
alnafie
sumber
53
Baru saja mencoba solusi Anda dan juga yang diterima. Keduanya bekerja, tetapi Anda hanya 2 baris dan tidak ada loop. Kedengarannya seperti pemenang bagi saya.
Corwin01
3
Untuk referensi kepada siapa saja yang mungkin memilih rute ini: Metode ini tidak cocok dengan tabel di IE9.
Corwin01
2
Di Chrome itu memberitahu saya Uncaught TypeError: undefined is not a function!
J86
19
Permata tersembunyi ini membutuhkan lebih banyak paparan.
Seth
Anda akan mendapatkan kesalahan jika Anda mencoba menggunakan metode ini pada sesuatu yang bukan Node, hanya FYI.
Alex W
15

alnafie memiliki jawaban yang bagus untuk pertanyaan ini. Saya ingin memberikan contoh kode untuk referensi:

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>

Semoga ini bermanfaat bagi orang lain.

Trevor Nestman
sumber
2
Saya benci menjadi ngotot untuk aturan tapi saya pikir akan lebih baik jika Anda membuat demo (jsfiddle, codepen, dll) dan kemudian menambahkannya ke jawaban Alnafie dengan menggunakan fitur edit atau mengirimkan komentar. Membuat jawaban hanya untuk mendemonstrasikan jawaban pengguna lain bukanlah cara SO bekerja, terlepas dari seberapa berguna informasi yang Anda berikan. Bayangkan jika setiap pengguna memutuskan untuk mendemonstrasikan jawaban lain dengan membuat jawaban - itu akan berantakan.
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>

tetapkan data untuk div dengan simbol "+ =" Anda dapat menambahkan data termasuk data html sebelumnya

vijay
sumber
11
Pertanyaannya secara khusus mengharuskan tidak menggunakan element.innerHTML += data.
musicnothing
1

Inilah yang DocumentFragmentdimaksudkan untuk.

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

Raynos
sumber
Saya baru saja menguji ini dan tidak berhasil. Apakah itu yang seharusnya digunakan?
Bob
Darimana Anda (a)berasal? Apakah itu salah cetak.
Ash Burlaczenko
1
Ya itu salah ketik, seharusnya e. Saya tidak berpikir Anda bisa menggunakan innerHTML untuk sebuah fragmen. Ini tidak berfungsi
Bob
@ Bob Saya sudah menggunakan cop-out jQuery.
Raynos
jQuery, tidak, tidak! Saya tidak akan memasukkan jQuery hanya untuk satu fungsi kecil: \ Itu hanya berlebihan
Bob
-1

Cara memancing dan sambil menggunakan kode ketat. Ada dua fungsi prasyarat yang diperlukan di bagian bawah posting ini.

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" />');

Tambahkan beberapa elemen (namespace hanya perlu di elemen induk):

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

Kode reusable dinamis:

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.
 }
}
John
sumber