Jak dołączyć dane do div za pomocą JavaScript?

404

Używam AJAX do dołączania danych do elementu div, gdzie wypełniam div z JavaScript, jak mogę dołączyć nowe dane do div bez utraty poprzednich danych znalezionych w div?

Adham
źródło
7
$ (div) .append (dane);
jimy
56
@jimy thats jquery, nie trzeba tego używać do tak trywialnych rzeczy
Naftali aka Neal
2
@Naprawdę jasne, ale używa również AJAX, więc jQuery jest zdecydowanie dobrym pomysłem!
Alnitak,
3
@Alnitak, ale skąd wiesz, że OP używa jQuery do czegoś?
Naftali alias Neal
26
@Alnitak, jQuery nie jest jedynym rozwiązaniem ajax
Naftali alias Neal

Odpowiedzi:

585

Spróbuj tego:

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

div.innerHTML += 'Extra stuff';
Naftali alias Neal
źródło
31
Niebezpieczeństwo, Will Robinson! To dodaje HTML , a nie tekst. Jeśli twoje dodatkowe rzeczy są dostarczane przez użytkownika, właśnie wprowadziłeś lukę w zabezpieczeniach. Lepiej skorzystać z odpowiedzi @ Chandu poniżej.
David Biorąc pod uwagę
8
Tak, jest to usterka XSS . Lepiej jest zamiast tego utworzyć węzeł tekstowy z zawartością, jak opisano w odpowiedzi poniżej.
David Biorąc pod uwagę
1
To również nie zadziała, jeśli divzawiera elementy z detektorami zdarzeń lub dane wejściowe z tekstem wprowadzonym przez użytkownika. Polecam odpowiedź Chandu .
user4642212,
2
Tak, zdecydowanie nie polecam tego, ponieważ spowoduje to zniszczenie stanu pól wyboru, detektorów zdarzeń.
Kurkula,
338

Korzystanie z appendChild:

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

Korzystanie z innerHTML:
To podejście usunie wszystkie nasłuchiwania z istniejących elementów, jak wspomniano w @BiAiB. Dlatego zachowaj ostrożność, jeśli planujesz korzystać z tej wersji.

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 
Chandu
źródło
Używam tej metody z moim „zadowolonym” elementem z wiązaniem angularjs i wszystko działa poprawnie!
errite
1
Powinna być rzeczywiście zaakceptowana odpowiedź. Nie tylko piękny sposób, ale innerHTML odbuduje DOM, a to nie jest dobre rozwiązanie. Użyj appendChild ().
Jan Sverre,
4
Jest to lepsze, ale createTextNodenie działa, jeśli ładujesz HTML. Jeśli na przykład chcesz dodać elementy listy, to nie zadziała. To dość ograniczające.
Jake
co jeśli chcemy zmienić tekst tego samego dołączonego węzła tekstowego w następnym wydarzeniu?
Rahul Mishra
120

Uważaj innerHTML, jakbyś coś stracił, gdy go używasz:

theDiv.innerHTML += 'content',     

Jest równa:

theDiv.innerHTML = theDiv.innerHTML + 'content'

Które zniszczą wszystkie węzły wewnątrz divi odtworzą nowe. Wszystkie odniesienia i słuchacze elementów w nim zawartych zostaną utracone .

Jeśli chcesz je zachować (na przykład po dołączeniu modułu obsługi kliknięć), musisz dołączyć nową zawartość do funkcji DOM (appendChild, insertAfter, insertBefore):

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )
BiAiB
źródło
2
tak, ale spowoduje to, że wewnątrz div rodzica będzie dodatkowy div, który nie jest potrzebny i może zepsuć niektóre style css
Naftali alias Neal
@Neal To tylko przykładowy sposób użycia appendChild. nie ma tutaj sensu.
BiAiB
Prawidłowy sposób na zrobienie tego appendChilddokonał @Cybernate
Naftali alias Neal
3
@Neal nie to nie jest. To nie jest poprawne ani niepoprawne. To zależy tylko od tego, co OP musi dołączyć: tekst, kod HTML lub coś innego.
BiAiB
1
@Neal Jest to doskonały sposób na dołączanie danych i jest bardziej uniwersalny niż document.createTextNode().
Alnitak,
57

Jeśli chcesz to zrobić szybko i nie chcesz stracić referencji, a detektory używają: .insertAdjacentHTML () ;

„Nie dokonuje ponownej analizy elementu, na którym jest używany, a zatem nie uszkadza istniejących elementów wewnątrz elementu. To i uniknięcie dodatkowego kroku serializacji sprawiają, że jest to znacznie szybsze niż bezpośrednia manipulacja HTML.”

Obsługiwane we wszystkich przeglądarkach głównych (IE6 +, FF8 +, Wszystkie inne i urządzenia mobilne): http://caniuse.com/#feat=insertadjacenthtml

Przykład z 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>
Milan Rakos
źródło
czy podczas korzystania z tej metody istnieją jakieś uwagi, ograniczenia itp.?
som
1
Niesamowita kompatybilność: lepsze rozwiązanie!
Arthur Araújo
2
Jest też insertAdjacentElement()i insertAdjacentText().
nyg
Ta metoda jest najlepszym rozwiązaniem!
Sergey NN
8

Nawet to zadziała:

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

div.innerHTML += 'Text to append';
Macfer Ann
źródło
6

Rozwiązanie IE9 + (Vista +), bez tworzenia nowych węzłów tekstowych:

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

Jednak to nie całkiem załatwiło sprawę, ponieważ potrzebowałem nowej linii po każdej wiadomości, więc mój DIV zmienił się w styl UL z tym kodem:

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

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

Różnice w stosunku do innerHTML

innerHTML zwraca HTML, jak wskazuje jego nazwa. Dość często, aby pobrać lub napisać tekst w elemencie, ludzie używają innerHTML. Zamiast tego należy użyć textContent. Ponieważ tekst nie jest analizowany jako HTML, prawdopodobnie będzie miał lepszą wydajność. Ponadto pozwala to uniknąć wektora ataku XSS.

LGT
źródło
3

możesz użyć jQuery. dzięki czemu jest to bardzo proste.

po prostu pobierz plik jQuery dodaj jQuery do swojego HTML
lub możesz użyć linku online:

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

i spróbuj tego:

 $("#divID").append(data);
Wisznu Miszra
źródło
1

Poniższa metoda jest mniej ogólna niż inne, ale jest świetna, gdy masz pewność, że twój ostatni węzeł potomny div jest już węzłem tekstowym. W ten sposób nie utworzysz nowego węzła tekstowego za pomocą 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
źródło
0

Dlaczego nie skorzystać z setAttribute?

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

Następnie możesz uzyskać te dane:

thisDiv.attrName;
thatOneGuy
źródło
Ponieważ to nie ma nic wspólnego z pytaniem?
FaZe Unempl0yedd
-1

skrypt Java

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

jquery

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

Użyj .html()bez żadnych argumentów, aby zobaczyć, że wpisałeś. Możesz użyć konsoli przeglądarki, aby szybko przetestować te funkcje przed użyciem ich w kodzie.

Deepu Sahni
źródło
To jest kopia zaakceptowanej odpowiedzi jedna po drugiej. Dlaczego?
Stephen Rauch,
innerHtml i html () działały inaczej w moim projekcie. innerHtml nic nie zrobił w jednym scenariuszu. Tak więc dodał, na wypadek gdyby był taki sam dla każdego innego.
Deepu Sahni