如何使用JavaScript将数据附加到div?


404

我正在使用AJAX将数据附加到div元素,从JavaScript中填充div,如何在不丢失div中找到的先前数据的情况下将新数据附加到div?


7
$(div).append(data);
吉米2011年

56
@jimy thats jquery,无需将其用于如此琐碎的事情
Naftali aka Neal

2
@可以,但是他也使用AJAX,所以jQuery绝对是个好主意!
Alnitak

3
@Alnitak,但是您怎么知道OP正在使用jQuery做任何事情?
Naftali又名Neal,

26
@ Alnitak,jQuery并不是唯一的 ajax解决方案
Naftali aka Neal

Answers:


585

尝试这个:

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

div.innerHTML += 'Extra stuff';

31
危险,威尔·鲁滨逊!这将添加HTML而不是文本。如果用户提供了您的Extra Stuff,则说明您刚刚引入了安全漏洞。最好使用下面的@Chandu答案。
大卫

8
是的,这是一个XSS漏洞。如下面的答案所述,最好用内容创建文本节点。
大卫

1
如果div包含具有事件侦听器的元素或具有用户输入的文本的输入,则这也不起作用。我推荐昌都答案
user4642212 '16


2
是的,我绝对不建议这样做,因为这会破坏所有复选框,事件侦听器的状态。
Kurkula

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绑定的“ contenteditable”元素一起使用,并且一切正常!
苦恼

1
确实应该是公认的答案。这不仅是一种漂亮的方法,而且innerHTML还将重建DOM,但这不是一个好的解决方案。使用appendChild()。
Jan Sverre'1

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
是的,但这会导致父div内有一个多余的div,这是不必要的,并且可能会弄乱某些CSS样式
Naftali aka Neal

@Neal这只是使用appendChild的示例方式。关键不在这里。
BiAiB 2011年

正确的方法appendChild是@Cyber​​nate
Naftali又名Neal

3
@尼尔不,不是。这既不正确也不正确。它仅取决于OP需要附加的内容:文本,html代码或其他内容。
BiAiB

1
@Neal这是追加数据的一种非常好的方法,并且比更具通用性document.createTextNode()
Alnitak

57

如果您想快速执行此操作并且不想丢失引用和侦听器,请使用:.insertAdjacentHTML() ;

“它不会重新解析正在使用的元素,因此不会破坏该元素内部的现有元素。而且避免了额外的序列化步骤,这使其比直接使用innerHTML操作快得多。”

所有主流浏览器(IE6 +,FF8 +,所有其他和移动版)均受支持:http : //caniuse.com/#feat=insertadjacenthtml

来自https://developer.mozilla.org/zh-CN/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>

使用此方法时是否有任何注意事项,约束条件等?
2016年

1
出色的兼容性:更好的解决方案!
ArthurAraújo16年

2
也有insertAdjacentElement()insertAdjacentText()
nyg


此方法是最佳解决方案!
谢尔盖NN


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/zh-CN/docs/Web/API/Node/textContent

与innerHTML的区别

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

以下方法没有其他方法通用,但是当您确定div的最后一个子节点已经是文本节点时,它非常有用。这样,您将不会使用MDN参考AppendData创建新的文本节点。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

为什么不只使用setAttribute?

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

然后,您可以通过以下方式获取此数据:

thisDiv.attrName;

因为那与问题无关吗?
FaZe Unempl0yedd '19

-1

Java脚本

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

jQuery的

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

使用时.html()不带任何参数即可查看是否已输入。您可以使用浏览器控制台快速测试这些功能,然后再在代码中使用它们。


这是彼此接受的答案的副本。为什么?
斯蒂芬·劳奇(Steven Rauch)

innerHtml和html()在我的项目中的工作方式有所不同。innerHtml在一种情况下什么也没做。所以添加它,以防其他人也一样。
Deepu Sahni
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.