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

Adh*_*ham 388 javascript

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

Nea*_*eal 542

试试这个:

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

div.innerHTML += 'Extra stuff';
Run Code Online (Sandbox Code Playgroud)

  • 威尔罗宾逊,危险!这会添加*HTML*,而不是文本.如果您的Extra Stuff由用户提供,那么您刚刚介绍了安全漏洞.最好使用@ Chandu的答案. (20认同)
  • 是的,这是一个[XSS漏洞](https://en.wikipedia.org/wiki/Cross-site_scripting).你最好用内容创建一个文本节点,如下面的答案中所述. (8认同)
  • 这不推荐,请参阅[是否可以在不破坏后代的事件监听器的情况下附加到innerHTML?](http://stackoverflow.com/q/595808/1048572) (8认同)
  • 如果`div` 包含带有事件侦听器的元素或带有用户输入文本的输入,这也不起作用。我推荐 [由 Chandu 回答](http://stackoverflow.com/a/5677825/4642212)。 (2认同)
  • 是的,我绝对不推荐这个,因为这会破坏任何复选框,事件监听器的状态. (2认同)

Cha*_*ndu 325

使用appendChild:

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
var content = document.createTextNode("<YOUR_CONTENT>");
theDiv.appendChild(content);
Run Code Online (Sandbox Code Playgroud)

使用innerHTML:
这种方法将删除@BiAiB提到的现有元素的所有侦听器.因此,如果您打算使用此版本,请务必小心.

var theDiv = document.getElementById("<ID_OF_THE_DIV>");
theDiv.innerHTML += "<YOUR_CONTENT>"; 
Run Code Online (Sandbox Code Playgroud)

  • 这样更好,但是如果要加载HTML,`createTextNode`将不起作用.例如,如果要添加列表项,则无效.这是非常有限的. (4认同)
  • @Jake如果需要插入HTML而不是纯文本,那么不要使用`createTextNode`。还有其他几种与此相关的 DOM 操作方法,例如 [`insertAdjacentHTML`](//developer.mozilla.org/docs/Web/API/Element/insertAdjacentHTML)、[`insertAdjacentElement`](//developer.mozilla. org/docs/Web/API/Element/insertAdjacentElement) 等。如果您使用了错误的工具,则不能称其为“限制”。不过,关于“数据”的含义,问题可能会更清楚。 (2认同)

BiA*_*AiB 117

当心innerHTML,当你使用它时,你会丢失一些东西:

theDiv.innerHTML += 'content',     
Run Code Online (Sandbox Code Playgroud)

相当于:

theDiv.innerHTML = theDiv.innerHTML + 'content'
Run Code Online (Sandbox Code Playgroud)

这会破坏你内部的所有节点div并重新创建新的节点.内部元素的所有引用和侦听器都将丢失.

如果你需要保留它们(例如,当你附加了一个单击处理程序时),你必须使用DOM函数(appendChild,insertAfter,insertBefore)附加新内容:

var newNode = document.createElement('div');      
newNode.innerHTML = data;
theDiv.appendChild( newNode )
Run Code Online (Sandbox Code Playgroud)

  • @Neal不,不是.这既不正确也不正确.它只取决于OP需要追加的内容:文本,HTML代码或其他东西. (3认同)
  • 是的但是这会导致在父div中有一个**额外的**div,这是不需要的,可能会搞乱一些css样式 (2认同)

Mil*_*kos 56

如果你想快速做到并且不想丢失引用,那么使用:.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>
Run Code Online (Sandbox Code Playgroud)

  • 还有`insertAdjacentElement()`和`insertAdjacentText()`. (2认同)

小智 17

如果您使用的是jQuery,则可以使用$('#mydiv').append('html content')它并保留现有内容.

http://api.jquery.com/append/


Mac*_*Ann 7

即使这样也会奏效:

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

div.innerHTML += 'Text to append';
Run Code Online (Sandbox Code Playgroud)


Cer*_*nce 7

我认为比迄今为止提到的任何选项都更好的选项是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');
Run Code Online (Sandbox Code Playgroud)
<div>
  <button>click</button>
</div>
Run Code Online (Sandbox Code Playgroud)

这种方法的优点包括:

  • 不修改 DOM 中现有的节点;不会破坏事件侦听器
  • 插入文本,而不是 HTML(最好仅.insertAdjacentHTML在故意插入 HTML 时使用 - 不必要地使用它在语义上不太合适,并且会增加 XSS 的风险)
  • 灵活的; 第一个参数.insertAdjacentText可能是beforebegin, beforeend, afterbegin, afterend,具体取决于您想要插入文本的位置


LGT*_*LGT 5

IE9 +(Vista +)解决方案,无需创建新的文本节点:

var div = document.getElementById("divID");
div.textContent += data + " ";
Run Code Online (Sandbox Code Playgroud)

但是,这对我来说并没有什么用处,因为我在每条消息后都需要换一行,因此我的DIV变成了带有以下代码的样式化UL:

var li = document.createElement("li");
var text = document.createTextNode(data);
li.appendChild(text);
ul.appendChild(li);
Run Code Online (Sandbox Code Playgroud)

来自https://developer.mozilla.org/zh-CN/docs/Web/API/Node/textContent

与innerHTML的区别

innerHTML返回其名称所指示的HTML。通常,为了检索或写入元素内的文本,人们使用innerHTML。应该使用textContent代替。因为文本没有被解析为HTML,所以它可能具有更好的性能。此外,这避免了XSS攻击媒介。