【问题标题】:Javascript - Append HTML to container element without innerHTMLJavascript - 将 HTML 附加到没有 innerHTML 的容器元素
【发布时间】:2011-09-12 08:45:18
【问题描述】:

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

element.innerHTML += htmldata

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

我可以这样做:

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

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

那怎么做呢?谢谢!

【问题讨论】:

标签: javascript html innerhtml


【解决方案1】:

我很惊讶没有一个答案提到insertAdjacentHTML() 方法。看看here。第一个参数是您希望附加字符串的位置(“beforebegin”、“afterbegin”、“beforeend”、“afterend”)。在 OP 的情况下,您将使用“beforeend”。第二个参数就是html字符串。

基本用法:

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

【讨论】:

  • 刚刚尝试了您的解决方案以及已接受的解决方案。两者都有效,但你的只有 2 行,没有循环。对我来说听起来像是赢家。
  • 供可能选择此路线的任何人参考:此方法不适用于 IE9 中的表格。
  • 在 Chrome 中它告诉我 Uncaught TypeError: undefined is not a function
  • 这个隐藏的宝石需要更多曝光。
  • 很烦人的是,这种方法在 Chrome 网络控制台中不能自动完成。 v79
【解决方案2】:

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

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

while(e.firstChild) {
    element.appendChild(e.firstChild);
}

【讨论】:

  • 我以为我们正在寻找不使用“innerHTML”的解决方案
  • @kennydelacruz:OP 不想将新 HTML 追加到现有 HTML,因为它会破坏并重新创建现有元素。 OP 通过创建新元素并附加该元素找到了解决方案,但他们不想添加其他元素。我只是扩展了该解决方案以表明他们可以移动/附加新创建的元素,这不会影响现有元素。
  • 我知道这是旧的,但谁能向我解释为什么可以迭代 e.firstChild?
  • @Toastgeraet:这个例子没有迭代over e.firstChild。相反,它会检查 e 是否有一个子元素,如果是,则将该子元素 移动 到该元素。
【解决方案3】:

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 的工作方式。想象一下,如果每个用户都决定通过创建一个答案来展示另一个答案 - 它会变得一团糟。
【解决方案4】:

这就是 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

【讨论】:

  • 我刚刚对此进行了测试,但它不起作用。应该这样使用吗?
  • 你从哪里得到(a)?是不是打错字了。
  • 是的,这是一个错字,应该是 e。我认为您不能将 innerHTML 用于片段。这不起作用
  • @Bob 我已经准备好使用 jQuery。
  • jQuery 不不!我不会只为一个小功能包含 jQuery :\ 这只是矫枉过正
【解决方案5】:
<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
【解决方案6】:

如何在使用严格代码的同时钓鱼。本文底部需要两个必备功能。

xml_add('before', id_('element_after'), '<span xmlns="http://www.w3.org/1999/xhtml">Some text.</span>');

xml_add('after', id_('element_before'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

xml_add('inside', id_('element_parent'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

添加多个元素(命名空间只需要在父元素上):

xml_add('inside', id_('element_parent'), '<div xmlns="http://www.w3.org/1999/xhtml"><input type="text" /><input type="button" /></div>');

动态可重用代码:

function id_(id) {return (document.getElementById(id)) ? document.getElementById(id) : false;}

function xml_add(pos, e, xml)
{
 e = (typeof e == 'string' && id_(e)) ? id_(e) : e;

 if (e.nodeName)
 {
  if (pos=='after') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e.nextSibling);}
  else if (pos=='before') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  else if (pos=='inside') {e.appendChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true));}
  else if (pos=='replace') {e.parentNode.replaceChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  //Add fragment and have it returned.
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-31
    • 2015-11-25
    • 2014-01-14
    • 2020-03-17
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多