我需要一种方法将HTML附加到容器元素而不使用innerHTML。我之所以不想使用innerHTML,是因为当它像这样使用时:
element.innerHTML += htmldata
它的工作原理是在添加旧的html和新的html之前先替换所有的html。这不好,因为它会重置动态媒体,如嵌入式Flash视频......
我可以这样做:
var e = document.createElement('span');
e.innerHTML = htmldata;
element.appendChild(e);
然而,这种方式的问题是现在文档中有额外的span标记,我不想要。
那怎么办呢?谢谢!
答案 0 :(得分:465)
我很惊讶没有一个答案提到insertAdjacentHTML()
方法。看看here。第一个参数是你想要附加字符串的地方(“beforebegin”,“afterbegin”,“beforeend”,“afterend”)。在OP的情况下,你会使用“beforeend”。第二个参数只是html字符串。
基本用法:
var d1 = document.getElementById('one');
d1.insertAdjacentHTML('beforeend', '<div id="two">two</div>');
答案 1 :(得分:80)
提供替代方法(因为使用DocumentFragment
似乎不起作用):您可以通过迭代新生成的节点的子节点来模拟它,并且只附加那些节点。
var e = document.createElement('div');
e.innerHTML = htmldata;
while(e.firstChild) {
element.appendChild(e.firstChild);
}
答案 2 :(得分:12)
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>
希望这对其他人有帮助。
答案 3 :(得分:2)
<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数据
答案 4 :(得分:1)
这是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);
答案 5 :(得分:-1)
如何使用严格的代码钓鱼和。这篇文章的底部需要两个必备功能。
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.
}
}