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

Bob*_*Bob 148 html javascript innerhtml

我需要一种方法将HTML附加到容器元素而不使用innerHTML.我不想使用innerHTML的原因是因为它使用时如下:

element.innerHTML += htmldata

它的工作原理是在添加旧的html和新的html之前先替换所有的html.这不好,因为它重置了嵌入式Flash视频等动态媒体......

我能用这种方式做到这一点:

var e = document.createElement('span');
e.innerHTML = htmldata;
element.appendChild(e);
Run Code Online (Sandbox Code Playgroud)

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

那怎么办呢?谢谢!

aln*_*fie 510

我很惊讶没有一个答案提到这个insertAdjacentHTML()方法.检查它在这里.第一个参数是你想要附加字符串的地方("beforebegin","afterbegin","beforeend","afterend").在OP的情况下,你会使用"beforeend".第二个参数只是html字符串.

基本用法:

var d1 = document.getElementById('one');
d1.insertAdjacentHTML('beforeend', '<div id="two">two</div>');
Run Code Online (Sandbox Code Playgroud)

  • 刚试过你的解决方案和接受的解决方案.两者都有效,但你的只有2行,没有循环.听起来像是我的赢家. (47认同)
  • 这个隐藏的宝石需要更多曝光. (12认同)
  • 我希望我能多次投票!(救了我的屁股). (10认同)
  • 对于可能选择此路由的任何人的参考:此方法与IE9中的表不匹配. (3认同)
  • 在Chrome中,它告诉我"Uncaught TypeError:undefined不是函数"! (2认同)
  • 非常烦人的是,此方法不会在 Chrome Web 控制台中自动完成。v79 (2认同)

Fel*_*ing 90

提供替代方法(因为使用DocumentFragment似乎不起作用):您可以通过迭代新生成的节点的子节点来模拟它,并仅附加它们.

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

while(e.firstChild) {
    element.appendChild(e.firstChild);
}
Run Code Online (Sandbox Code Playgroud)

  • @kennydelacruz:OP 不想将新 HTML *附加*到现有 HTML,因为它会破坏并重新创建现有元素。OP 通过创建一个新元素并附加该元素找到了解决方案,但他们不想添加其他元素。我只是扩展了该解决方案以表明它们可以移动/附加新创建的元素,这不会影响现有元素。 (3认同)
  • @Toastgeraet:这个例子不是在“e.firstChild”上进行迭代。相反,它检查“e”是否有子元素,如果有,则“移动”该子元素到该元素。 (3认同)
  • 我以为我们正在寻找不使用“innerHTML”的解决方案 (2认同)

Tre*_*man 13

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++;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
<button type="button" onclick="addChild()">Append Child</button>
<div id="i-want-more-children">
  <p>Child 1</p>
  <p>Child 2</p>
</div>
Run Code Online (Sandbox Code Playgroud)

希望这对其他人有帮助.

  • 我讨厌成为规则的坚持者,但我认为如果创建一个演示(jsfiddle,codepen等)然后通过使用编辑功能或提交评论将其添加到Alnafie的答案中,效果会更好。不管您提供的信息有多有用,创建一个答案来证明另一个用户的答案都不是SO的工作原理。想象一下,如果每个用户都决定通过创建答案来演示另一个答案-这会变得很混乱。 (2认同)

Ray*_*nos 5

这就是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);
Run Code Online (Sandbox Code Playgroud)

document.createDocumentFragment,.childNodes