Javascript - 将 HTML 附加到没有 innerHTML 的容器元素

IT技术 javascript html innerhtml
2021-01-23 12:09:50

我需要一种不使用innerHTML 将HTML 附加到容器元素的方法。我不想使用innerHTML的原因是因为它是这样使用的:

element.innerHTML += htmldata

它的工作原理是先替换所有 html,然后再添加旧 html 和新 html。这不好,因为它会重置动态媒体,例如嵌入式 Flash 视频...

我可以通过这种方式做到这一点:

var e = document.createElement('span');
e.innerHTML = htmldata;
element.appendChild(e);

然而,这种方式的问题是现在文档中有我不想要的额外 span 标签。

这怎么能做到呢?谢谢!

6个回答

我很惊讶没有一个答案提到该insertAdjacentHTML()方法。检查它在这里第一个参数是您想要附加字符串并采用的位置(“beforebegin”、“afterbegin”、“beforeend”、“afterend”)。在 OP 的情况下,您将使用“beforeend”。第二个参数只是 html 字符串。

基本用法:

var d1 = document.getElementById('one');
d1.insertAdjacentHTML('beforeend', '<div id="two">two</div>');
供可能选择此路线的任何人参考:此方法不适用于 IE9 中的表格。
2021-03-21 12:09:50
在 Chrome 中它告诉我Uncaught TypeError: undefined is not a function
2021-03-24 12:09:50
非常烦人的是,此方法不会在 Chrome 网络控制台中自动完成。v79
2021-03-26 12:09:50
刚刚尝试了您的解决方案以及已接受的解决方案。两者都有效,但你的只有 2 行,没有循环。听起来像我的赢家。
2021-04-02 12:09:50
这个隐藏的宝石需要更多的曝光。
2021-04-03 12:09:50

给出一个替代方案(因为 usingDocumentFragment似乎不起作用):您可以通过迭代新生成节点的子节点来模拟它,并且只附加它们。

var e = document.createElement('div');
e.innerHTML = htmldata;

while(e.firstChild) {
    element.appendChild(e.firstChild);
}
我知道这很旧,但谁能向我解释为什么可以迭代 e.firstChild?
2021-03-19 12:09:50
@Toastgeraet:这是例子并不迭代 e.firstChild相反,它检查是否e有子元素,如果有,则将该子元素移至元素。
2021-03-26 12:09:50
我以为我们正在寻找不使用“innerHTML”的解决方案
2021-04-09 12:09:50
@kennydelacruz:OP 不想新 HTML附加到现有 HTML,因为它会破坏并重新创建现有元素。OP 通过创建一个新元素并附加它找到了一个解决方案,但他们不想添加额外的元素。我只是扩展了该解决方案以表明他们可以移动/附加新创建的元素,这不会影响现有元素。
2021-04-12 12:09:50

alnafie 对这个问题有很好的回答。我想举一个他的代码示例以供参考:

var childNumber = 3;

function addChild() {
  var parent = document.getElementById('i-want-more-children');
  var newChild = '<p>Child ' + childNumber + '</p>';
  parent.insertAdjacentHTML('beforeend', newChild);
  childNumber++;
}
body {
  text-align: center;
}
button {
  background: rgba(7, 99, 53, .1);
  border: 3px solid rgba(7, 99, 53, 1);
  border-radius: 5px;
  color: rgba(7, 99, 53, 1);
  cursor: pointer;
  line-height: 40px;
  font-size: 30px;
  outline: none;
  padding: 0 20px;
  transition: all .3s;
}
button:hover {
  background: rgba(7, 99, 53, 1);
  color: rgba(255,255,255,1);
}
p {
  font-size: 20px;
  font-weight: bold;
}
<button type="button" onclick="addChild()">Append Child</button>
<div id="i-want-more-children">
  <p>Child 1</p>
  <p>Child 2</p>
</div>

希望这对其他人有帮助。

我讨厌成为规则的坚持者,但我认为如果您创建了一个演示(jsfiddle、codepen 等),然后通过使用编辑功能或提交评论将其添加到 Alnafie 的答案中会更好。无论您提供的信息有多么有用,创建一个仅用于演示其他用户的答案的答案都不是 SO 的工作原理。想象一下,如果每个用户都决定通过创建一个答案来展示另一个答案 - 它会变得一团糟。
2021-04-12 12:09:50
<div id="Result">
</div>

<script>
for(var i=0; i<=10; i++){
var data = "<b>vijay</b>";
 document.getElementById('Result').innerHTML += data;
}
</script>

使用“+=”符号为 div 分配数据,您可以附加数据,包括以前的 html 数据

该问题特别要求使用element.innerHTML += data.
2021-03-31 12:09:50

这是什么DocumentFragment意思。

var frag = document.createDocumentFragment();
var span = document.createElement("span");
span.innerHTML = htmldata;
for (var i = 0, ii = span.childNodes.length; i < ii; i++) {
    frag.appendChild(span.childNodes[i]);
}
element.appendChild(frag);

document.createDocumentFragment, .childNodes

我刚刚测试了这个,它不起作用。应该这样使用吗?
2021-03-20 12:09:50
@Bob 我已经去逃避使用 jQuery。
2021-04-01 12:09:50
jQuery 不不!我不会仅仅为了一个小功能而包含 jQuery :\ 这只是矫枉过正
2021-04-03 12:09:50
是的,这是一个错字,它应该是 e。我认为您不能将 innerHTML 用于片段。这不起作用
2021-04-05 12:09:50
你从哪里来(a)是不是打错字了。
2021-04-06 12:09:50