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?


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';

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

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 )

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>

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';

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.


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

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

0

Dlaczego nie skorzystać z setAttribute?

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

Następnie możesz uzyskać te dane:

thisDiv.attrName;

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.