Как добавить данные в div с помощью JavaScript?

405

Я использую AJAX для добавления данных в элемент div, где я заполняю div из JavaScript, как я могу добавить новые данные в div без потери предыдущих данных, найденных в div?

Adham
источник
7
$ (дела) .append (данные);
Джимы
56
@jimy вот это jquery, нет необходимости использовать это для такой тривиальной вещи
Нафтали, он же Нил,
2
@ Конечно, но он тоже использует AJAX, так что jQuery - хорошая идея!
Альнитак
3
@Alnitak, но откуда ты знаешь, что ОП использует jQuery для чего-либо?
Нафтали ака Нил
26
@Alnitak, jQuery - не единственное решение ajax
Нафтали, он же Нил,

Ответы:

586

Попробуй это:

var div = document.getElementById('divID');

div.innerHTML += 'Extra stuff';
Нафтали ака Нил
источник
31
Опасность, Уилл Робинсон! Это добавляет HTML , а не текст. Если ваш дополнительный материал предоставлен пользователем, вы только что представили уязвимость системы безопасности. Лучше использовать ответ @ Chandu ниже.
Дэвид Дан
8
Да, это уязвимость XSS . Вместо этого вам гораздо лучше создать текстовый узел с контентом, как описано в ответе ниже.
Дэвид Дан
1
Это также не будет работать, если в нем divсодержатся элементы со слушателями событий или вводимые данные с введенным пользователем текстом. Я рекомендую ответ Чанду .
user4642212
2
Да, я определенно не рекомендую это, поскольку это разрушит состояние любых флажков, слушателей событий.
Kurkula
339

Использование appendChild:

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
var content = document.createTextNode("<YOUR_CONTENT>");
theDiv.appendChild(content);

Использование innerHTML:
этот подход удалит всех слушателей существующих элементов, как упомянуто @BiAiB. Поэтому будьте осторожны, если вы планируете использовать эту версию.

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 
Chandu
источник
Я использую этот метод с моим «contenteditable» элементом с привязкой angularjs, и все работает правильно!
неправильно от
1
Должен быть действительно принятым ответом. Не только красивый способ, но innerHTML перестроит DOM, и это просто не хорошее решение. Используйте appendChild ().
Ян Сверре
4
Это лучше, но createTextNodeне будет работать, если вы загружаете HTML. Например, если вы хотите добавить элементы списка, это не сработает. Это довольно ограничивающее.
Джейк
Что если мы хотим изменить текст того же узла с добавленным текстом в следующем событии?
Рахул Мишра
120

Остерегайтесь innerHTML, вы что-то теряете, когда используете это:

theDiv.innerHTML += 'content',     

Эквивалентно:

theDiv.innerHTML = theDiv.innerHTML + 'content'

Который уничтожит все узлы внутри вас divи создаст новые. Все ссылки и слушатели элементов внутри него будут потеряны .

Если вам нужно сохранить их (например, когда вы прикрепили обработчик кликов), вам нужно добавить новое содержимое с помощью функций DOM (appendChild, insertAfter, insertBefore):

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )
BiAiB
источник
2
да, но это приведет к тому, что внутри родительского div будет дополнительный div, который не нужен и может испортить некоторые стили CSS
Naftali aka Neal
@Neal, это просто пример использования appendChild. Дело не в этом.
BiAiB
Правильный способ сделать это appendChildсделал @Cybernate
Нафтали, он же Нил,
3
@ Нил нет, это не так. Это ни правильно, ни неправильно. Это зависит только от того, что OP должен добавить: текст, HTML-код или что-то еще.
BiAiB
1
@Neal - это отличный способ добавления данных, более универсальный, чем document.createTextNode().
Альнитак
57

Если вы хотите сделать это быстро и не хотите терять ссылки и слушатели, используйте: .insertAdjacentHTML () ;

«Он не выполняет повторный анализ элемента, на котором он используется, и, следовательно, он не повреждает существующие элементы внутри элемента. Это и отсутствие дополнительного шага сериализации делают его намного быстрее, чем прямые манипуляции с внутренним HTML».

Поддерживается всеми основными браузерами (IE6 +, FF8 +, Все остальные и мобильные): http://caniuse.com/#feat=insertadjacenthtml

Пример из https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML

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

// At this point, the new structure is:
// <div id="one">one</div><div id="two">two</div>
Милан Ракос
источник
Есть ли какие-либо соображения, ограничения и т. д. при использовании этого метода?
сома
1
Потрясающая совместимость: лучшее решение!
Артур Араужо,
2
Существует также insertAdjacentElement()и insertAdjacentText().
17
w3schools.com/jsref/met_node_insertadjacenthtml.asp
Прадип Кумар Прабахаран
Этот метод является лучшим решением!
Сергей Н.Н.
18

Если вы используете jQuery, вы можете использовать $('#mydiv').append('html content')его, и он сохранит существующий контент.

http://api.jquery.com/append/

Томас Бразингтон
источник
8

Даже это будет работать:

var div = document.getElementById('divID');

div.innerHTML += 'Text to append';
Макфер Энн
источник
6

Решение IE9 + (Vista +), без создания новых текстовых узлов:

var div = document.getElementById("divID");
div.textContent += data + " ";

Однако это не совсем помогло мне, так как мне нужно было новую строку после каждого сообщения, поэтому мой DIV превратился в стилизованный UL с этим кодом:

var li = document.createElement("li");
var text = document.createTextNode(data);
li.appendChild(text);
ul.appendChild(li);

С https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent :

Отличия от innerHTML

innerHTML возвращает HTML, как указывает его имя. Довольно часто для извлечения или записи текста внутри элемента люди используют innerHTML. Вместо этого следует использовать textContent. Поскольку текст не анализируется как HTML, он, вероятно, будет иметь более высокую производительность. Кроме того, это позволяет избежать вектора атаки XSS.

LGT
источник
3

Вы можете использовать JQuery. которые делают это очень просто.

Просто скачайте файл jQuery, добавьте jQuery в свой HTML
или вы можете перейти по ссылке онлайн:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

и попробуйте это:

 $("#divID").append(data);
Вишну Мишра
источник
1

Следующий метод является менее общим, чем другие, однако это замечательно, если вы уверены, что ваш последний дочерний узел div уже является текстовым узлом. Таким образом, вы не будете создавать новый текстовый узел, используя appendData MDN Reference AppendData

let mydiv = document.getElementById("divId");
let lastChild = mydiv.lastChild;

if(lastChild && lastChild.nodeType === Node.TEXT_NODE ) //test if there is at least a node and the last is a text node
   lastChild.appendData("YOUR TEXT CONTENT");
Umbert
источник
0

Почему бы просто не использовать setAttribute?

thisDiv.setAttribute('attrName','data you wish to append');

Тогда вы можете получить эти данные:

thisDiv.attrName;
thatOneGuy
источник
Потому что это не имеет ничего общего с вопросом?
FaZe Unempl0yedd
-1

сценарий Java

document.getElementById("divID").html("this text will be added to div");

JQuery

$("#divID").html("this text will be added to div");

Используйте .html()без каких-либо аргументов, чтобы увидеть, что вы ввели. Вы можете использовать консоль браузера для быстрого тестирования этих функций, прежде чем использовать их в своем коде.

Дипу Сахни
источник
Это копия принятого ответа друг друга. Почему?
Стивен Раух
innerHtml и html () работали по-разному в моем проекте. innerHtml ничего не сделал в одном сценарии. Так добавил, на случай, если это то же самое для всех остальных.
Дипу Сахни