Javascript - додайте HTML до елемента контейнера без InternalHTML


167

Мені потрібен спосіб додавання HTML до елемента контейнера, не використовуючи innerHTML. Причина, чому я не хочу використовувати innerHTML, полягає в тому, що коли він використовується таким чином:

element.innerHTML += htmldata

Він працює, замінюючи спочатку всі HTML-файли перед тим, як додати старий HTML плюс новий html. Це не добре, оскільки він скидає динамічні носії інформації, такі як вбудовані флеш-відео ...

Я міг би це зробити так, що працює:

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

Однак проблема з цим способом полягає в тому, що в документі є той додатковий тег span, який я не хочу.

Як це можна зробити тоді? Дякую!


1
Чому б не використовувати Jquery? Перевірте мою детальну відповідь нижче. stackoverflow.com/a/50482776/5320562
Loukan ElKadi

Відповіді:


102

Щоб надати альтернативу (оскільки використання DocumentFragment, здається, не працює): Ви можете імітувати її, повторивши дітьми новоствореного вузла, і лише додати їх.

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

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

2
Я думав, що ми шукаємо рішення, яке не використовує "innerHTML"
kennydelacruz

1
@kennydelacruz: ОП не хотіла додавати новий HTML до існуючого HTML, оскільки він руйнує та відтворює наявні елементи. ОП знайшло рішення, створивши новий елемент і додавши це, але вони не хотіли додати додатковий елемент. Я просто розширив це рішення, щоб показати, що вони можуть переміщувати / додавати новостворені елементи, які не впливають на існуючі елементи.
Фелікс Клінг

Я знаю, що це по-старому, але чи може хто-небудь пояснити мені, чому можна перебирати на e.firstChild?
Тостгерает

1
@Toastgeraet: Це приклад не ітерація над e.firstChild . Швидше, він перевіряє, чи eє дитина, і якщо так, перемістіть його до елемента.
Фелікс Клінг

570

Я здивований, що жодна з відповідей не згадала про insertAdjacentHTML()метод. Перевірте це тут . Перший параметр - це те, де ви бажаєте, щоб рядок додавались і приймали ("передбегіном", "післязаписом", "перед тим", "після". У ситуації з ОП ви б використовували "заздалегідь". Другий параметр - це лише рядок html.

Основне використання:

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

53
Просто спробували ваше рішення, а також прийняте. Обидва працюють, але у вас лише 2 рядки і ніяких циклів. Мені звучить переможець.
Corwin01

3
Для ознайомлення з усіма, хто може обрати цей маршрут: Цей метод не грає добре із таблицями в IE9.
Corwin01

2
У Chrome він мені каже Uncaught TypeError: undefined is not a function!
J86

19
Цей прихований дорогоцінний камінь потребує більшого опромінення.
Сет

Ви отримаєте помилку, якщо спробуєте скористатися цим методом на чомусь, що не є Вузлом, просто FYI.
Alex W

15

alnafie має чудову відповідь на це питання. Я хотів навести приклад його коду для довідки:

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>

Сподіваємось, це корисно для інших.


2
Я ненавиджу бути стикером правил, але я думаю, що було б краще, якби ви створили демонстрацію (jsfiddle, codepen тощо), а потім додали це до відповіді Alnafie, використовуючи функцію редагування або подаючи коментар. Створення відповіді лише для демонстрації відповіді іншого користувача полягає не в тому, як ТАК працює, незалежно від того, наскільки корисна інформація, яку ви надали. Уявіть собі, якби кожен користувач вирішив продемонструвати іншу відповідь, створивши відповідь - вона стане брудною.
Мартін Джеймс

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 із символом "+ =" Ви можете додавати дані, включаючи попередні HTML-дані


11
Питання конкретно не потребує використання element.innerHTML += data.
musicnothing

1

Це те, що DocumentFragmentбуло призначено для.

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


Я просто перевірив це, і це не працює. Це, як це слід використовувати?
Боб

Звідки ти берешся (a)? Це помилка друку.
Еш Бурлаценко

1
Так, це помилка друку, це має бути e. Я не думаю, що ви можете використовувати innerHTML для фрагмента. Це не працює
Боб

@Bob Я пішов на розвідку, використовую jQuery.
Райнос

jQuery ні ні! Я не збираюся включати jQuery лише для однієї невеликої функції: \ Це просто зайвий рівень
Боб

-1

Як ловити рибу і при цьому використовувати суворий код. Внизу цієї посади необхідні дві необхідні функції.

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

Додайте кілька елементів (простір імен повинен бути лише на батьківському елементі):

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

Динамічний код для багаторазового використання:

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.
 }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.