将 HTML 字符串附加到 DOM

IT技术 javascript html dom browser
2021-02-01 02:06:29

如何附加一个 HTML 字符串,例如

var str = '<p>Just some <span>text</span> here</p>';

<div>与ID test

(顺便说一句div.innerHTML += str;是不可接受的。)

6个回答

使用insertAdjacentHTML在目前所有的浏览器都支持

div.insertAdjacentHTML( 'beforeend', str );

position 参数beforeend将添加到元素内部,在其最后一个子元素之后。

现场演示: http : //jsfiddle.net/euQ5n/

此外,insertAdjacentHTML维护更改的表单元素的值,而追加以innerHTML重建元素并丢失所有表单上下文。
2021-03-27 02:06:29
@alex 这是相同的概念:解析 HTML 字符串并将其放入 DOM。但功能不同 -innerHTML将字符串放入元素中(替换所有子元素),而insertAdjacentHTML将它(1)放在元素之前,(2)元素之后,(3)在第一个子元素之前的元素中,或(4)在最后一个孩子之后的元素内。
2021-03-30 02:06:29
@alexinsertAdjacentHTML比附加到 快innerHTML,因为insertAdjacentHTML不会序列化和重新解析元素的现有子元素。
2021-04-11 02:06:29

表现

AppendChild(E) 在 chrome 和 safari 上比其他解决方案快 2 倍以上,insertAdjacentHTML(F) 在 Firefox 上最快。innerHTML=(B)(不要混淆+=(A))是在所有的浏览器第二快速的解决方案,这是更方便的比E和F.

细节

设置环境 (2019.07.10) MacOs High Sierra 10.13.4 on Chrome 75.0.3770 (64-bit), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64-bit)

在此处输入图片说明

  • 在 Chrome E(每秒 140k 次操作)上最快,B (47k) 和 F (46k) 次之,A (332) 最慢
  • 在firefox上F(94k)最快,然后B(80k),D(73k),E(64k),C(21k)最慢是A(466)
  • 在 Safari 上 E(207k) 最快,然后是 B(89k)、F(88k)、D(83k)、C (25k),最慢的是 A(509)

您可以在此处在您的机器上重播测试

可读性通常比性能更重要。但是谢谢你的腿部工作。
2021-03-14 02:06:29
使用 innerHTML 似乎不太好,因为浏览器必须再次解析整堆 HTML 而不是添加到尾部
2021-04-01 02:06:29
@Jay 优化应仅在需要时使用,并且通常必须进行丰富的注释
2021-04-04 02:06:29

这是可以接受的吗?

var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);

js小提琴

但是尼尔的答案是更好的解决方案。

@Šime -谢谢。我找到了 WHATWG 版本。它在DOM 解析和序列化规范中。它表明除了innerHTML 和insertAdjacentHTML,还有outerHTML,我认为还有createContextualFragment。
2021-03-13 02:06:29
@Alohci有另一种方法:insertAdjacentHTML
2021-03-20 02:06:29
@Šime 使用 DOM API总是感觉像一个黑客 :P 您是否更愿意在没有 的情况下 对字符串进行反序列化innerHTML
2021-03-27 02:06:29
嗯,是的,如果有另一种方式来利用浏览器的 HTML 解析器,我很想知道......
2021-03-28 02:06:29
@Šime - 我认为只有两种方法可以利用浏览器的 HTML 解析器,innerHTML 和 document.write。如果你认为 innerHTML 是一个黑客......
2021-03-29 02:06:29

这个想法是innerHTML在中间元素上使用,然后将其所有子节点通过appendChild.

var target = document.getElementById('test');
var str = '<p>Just some <span>text</span> here</p>';

var temp = document.createElement('div');
temp.innerHTML = str;
while (temp.firstChild) {
  target.appendChild(temp.firstChild);
}

这避免了清除任何事件处理程序,div#test但仍然允许您附加一个 HTML 字符串。

正确的方法是使用insertAdjacentHTML. 在 Firefox 8 之前,Range.createContextualFragment如果您的不str包含script标签,您可以回退使用

如果您的strcontainsscript标签,则需要在插入片段之前script从返回的片段中删除元素createContextualFragment否则,脚本将运行。insertAdjacentHTML标记脚本不可执行。)

谢谢你提到createContextualFragment 我正在寻找一种方法,使一些 html 包含脚本仅在用户同意设置 cookie 时运行。
2021-03-30 02:06:29