Як додати дані до div за допомогою JavaScript?


404

Я використовую AJAX для додавання даних до елемента div, де я заповнюю div з JavaScript, як я можу додавати нові дані до div, не втрачаючи попередніх даних, знайдених у div?


7
$ (div) .append (дані);
jimy

56
@jimy thats jquery, не потрібно використовувати це для такої дрібниці
Naftali aka Neal

2
@Neal впевнений, але він також використовує AJAX, тому jQuery, безумовно, хороша ідея!
Альнітак

3
@Alnitak, але як ти знаєш, що ОП використовує jQuery для чого-небудь?
Naftali aka Neal

26
@Alnitak, jQuery - не єдине рішення ajax
Naftali aka Neal

Відповіді:


585

Спробуйте це:

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

div.innerHTML += 'Extra stuff';

31
Небезпека, Віл Робінзон! Це додає HTML , а не текст. Якщо ваші додаткові речі надає користувач, ви щойно ввели вразливість безпеки. Краще скористатися відповіддю @ Чанду нижче.
Девід Даний

8
Так, це вразливість XSS . Вам набагато краще створити натомість текстовий вузол із вмістом, як це описано у відповіді нижче.
Девід Даний

1
Це також не працює, якщо divмістить елементи із слухачами подій або вхідними текстами із текстом, що вводиться користувачем. Рекомендую відповідь Чанду .
user4642212


2
Так, я точно не рекомендую цього, оскільки це знищить стан будь-яких прапорців, слухачів подій.
Куркула

338

Використання 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>"; 

Я використовую цей метод зі своїм "змістовим" елементом із прив'язкою angularjs, і все працює правильно!
неправильно

1
Справді має бути прийнята відповідь. Не тільки гарний спосіб, але внутрішнійHTML відновить DOM, і це просто не гарне рішення. Використовуйте appendChild ().
Jan Sverre

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 )

2
так, але це призведе до того, що у батьківському діві з’явиться додатковий дів, який не потрібен і може зіпсувати деякі стилі css
Naftali aka Neal

@Neal - це лише приклад способу використання appendChild. справа тут не в цьому.
BiAiB

Правильний спосіб зробити це appendChildбуло зроблено @Cybernate
Naftali aka Neal

3
@Neal ні, це не так. Це ні правильно, ні неправильно. Це просто залежить від того, що потрібно додати ОП: текст, 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().
nyg


Цей метод - найкраще рішення!
Сергій НН



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 :

Відмінності від InternalHTML

innerHTML повертає HTML, як вказано його ім'я. Досить часто для пошуку або запису тексту всередині елемента використовуються innerHTML. замість цього слід використовувати textContent. Оскільки текст не розбирається як HTML, швидше за все, він матиме кращу ефективність. Крім того, це дозволяє уникнути вектора атаки XSS.


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

Наступний метод менш загальний, ніж інші, але він чудовий, коли ви впевнені, що ваш останній дочірній вузол діва вже текстовий вузол. Таким чином, ви не створите новий текстовий вузол, використовуючи appendData довідник MDN Додаток

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

0

Чому б просто не використовувати setAttribute?

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

Потім ви можете отримати ці дані:

thisDiv.attrName;

Тому що це не має нічого спільного з питанням?
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 () працювали по-різному над моїм проектом. Внутрішній HTML не зробив нічого за одним сценарієм. Тож додав його, якщо він такий самий для будь-кого іншого.
Deepu Sahni
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.