我正在使用AJAX将数据附加到一个<div>
元素上,我从JavaScript中填充这个 <div>
。如何在不丢失其中先前的数据的情况下向<div>
附加新数据?
我正在使用AJAX将数据附加到一个<div>
元素上,我从JavaScript中填充这个 <div>
。如何在不丢失其中先前的数据的情况下向<div>
附加新数据?
试试这个:
var div = document.getElementById('divID');
div.innerHTML += 'Extra stuff';
使用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>";
createTextNode
。 与此相关的DOM操作有几种其他方法,例如insertAdjacentHTML
,insertAdjacentElement
等。如果使用错误的工具,就不能称其为“限制”。然而,问题可能需要更清晰地说明“数据”的含义。 - Sebastian Simon当你使用 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);
appendChild
方法是由 @Cybernate 完成的。 - Naftalidocument.createTextNode()
更灵活。 - Alnitak如果您想要快速操作而且不想失去引用和监听器,请使用:.insertAdjacentHTML();
它不会重新解析正在使用的元素,因此不会破坏元素内现有的元素。这样做,并避免序列化的额外步骤,使其比直接使用innerHTML操作更快。
在所有主流浏览器上支持(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>
insertAdjacentElement()
å’ŒinsertAdjacentText()
。 - nyg如果您正在使用jQuery,可以使用$('#mydiv').append('html content')
将内容添加到元素中,并且它会保留现有的内容。
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:
与innerHTML的区别
innerHTML会返回HTML,正如其名。人们经常使用innerHTML来检索或写入元素内的文本。应该使用textContent代替innerHTML。因为文本不被解析为HTML,所以可能具有更好的性能。此外,这可以避免XSS攻击向量。
var div = document.getElementById('divID');
div.innerHTML += 'Text to append';
我认为比目前提到的任何选项更好的选择是Element.insertAdjacentText()
。
// Example listener on a child element
// Included in this snippet to show that the listener does not get corrupted
document.querySelector('button').addEventListener('click', () => {
console.log('click');
});
// to actually insert the text:
document.querySelector('div').insertAdjacentText('beforeend', 'more text');
<div>
<button>click</button>
</div>
采用这种方法的优点包括:
.insertAdjacentHTML
- 不必要地使用它不太语义化,可能增加XSS的风险).insertAdjacentText
的第一个参数可以是beforebegin
,beforeend
,afterbegin
,afterend
,具体取决于您想插入文本的位置您可以使用jQuery。它使得操作变得非常简单。
只需下载jQuery文件并将其添加到您的HTML中
或者您可以使用在线链接:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
尝试执行以下操作:
$("#divID").append(data);
appendData
创建新的文本节点。MDN参考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");