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.