【发布时间】:2013-02-25 17:43:14
【问题描述】:
考虑以下 DOM 片段:
<div id="div-1">foo</div>
<div id="div-2">bar</div>
是否可以在 div 之间插入 HTML 字符串(编辑:包含要呈现的标签)而不将其包装在通过 document.createElement 创建的另一个 div(编辑:或其他标签)中并设置其innerHTML 属性?
【问题讨论】:
标签: javascript html dom
考虑以下 DOM 片段:
<div id="div-1">foo</div>
<div id="div-2">bar</div>
是否可以在 div 之间插入 HTML 字符串(编辑:包含要呈现的标签)而不将其包装在通过 document.createElement 创建的另一个 div(编辑:或其他标签)中并设置其innerHTML 属性?
【问题讨论】:
标签: javascript html dom
大部分浏览器都支持element#insertAdjacentHTML(),最终成为标准的in the HTML5 specification。不幸的是,Firefox 7 及更低版本不支持它,但我设法找到a workaround that uses ranges 来插入 HTML。我在下面对其进行了调整以适用于您的场景:
var el = document.getElementById("div-2"),
html = "<span>Some HTML <b>here</b></span>";
// Internet Explorer, Opera, Chrome, Firefox 8+ and Safari
if (el.insertAdjacentHTML)
el.insertAdjacentHTML ("beforebegin", html);
else {
var range = document.createRange();
var frag = range.createContextualFragment(html);
el.parentNode.insertBefore(frag, el);
}
【讨论】:
这适用于纯文本,这就是我阅读您原始问题的方式(有关包含标签的字符串的更新,请参见下文):
var div = document.getElementById('div-2');
var textNode = document.createTextNode('your text');
div.parentNode.insertBefore(textNode, div);
如果你开始:
<div id="div-1">foo</div>div id="div-2">bar</div>
(注意它们之间没有空格)那么上面的结果正是你使用这个 HTML 得到的结果:
<div id="div-1">foo</div>your text<div id="div-2">bar</div>
如果你真的在 div 之间有那个空白,那么你已经有一个文本节点,上面会在它旁边插入另一个。对于几乎所有意图和目的,这并不重要,但如果这让您感到困扰,您可以根据需要附加到现有的文本节点:
var text = 'your text';
var div = document.getElementById('div-2');
var prev = div.previousSibling;
if (prev && prev.nodeType == 3) { // 3 == TEXT_NODE
// Prev is a text node, append to it
prev.nodeValue = prev.nodeValue + text;
}
else {
// Prev isn't a text node, insert one
var textNode = document.createTextNode(text);
div.parentNode.insertBefore(textNode, div);
}
W3C 文档链接:insertBefore、createTextNode
在您修改后的问题中,您说过您希望在执行所有这些操作时包含要解释的标签。这是可能的,但它是迂回的。首先将 HTML 字符串放入一个元素中,然后将内容移到上面,如下所示:
var text, div, tempdiv, node, next, parent;
// The text
text = 'your text <em>with</em> <strong>tags</strong> in it';
// Get the element to insert in front of, and its parent
div = document.getElementById('div-2');
parent = div.parentNode;
// Create a temporary container and render the HTML to it
tempdiv = document.createElement('div');
tempdiv.innerHTML = text;
// Walk through the children of the container, moving them
// to the desired target. Note that we have to be sure to
// grab the node's next sibling *before* we move it, because
// these things are live and when we moev it, well, the next
// sibling will become div-2!
node = tempdiv.firstChild;
next = node.nextSibling;
while (node) {
parent.insertBefore(node, div);
node = next;
next = node ? node.nextSibling : undefined;
}
但是这里有龙,您必须根据要插入的内容选择容器元素。例如,我们不能在上面的代码中使用<tr>,因为我们将它插入div,而不是tbody,所以这是无效的,结果是特定于实现的。这些复杂性是我们有图书馆来帮助我们的原因。您要求提供原始 DOM 答案,这就是上面的内容,但我真的会查看 jQuery、Closure、Prototype、YUI 或 any of several others。他们会为你解决很多问题。
【讨论】:
var neuB = document.createElement("b");
var neuBText = document.createTextNode("mit fettem Text ");
neuB.appendChild(neuBText);
document.getElementById("derText").insertBefore(neuB, document.getElementById("derKursiveText"));
您搜索:insertBefore
【讨论】:
使用 jquery 很简单:
$("#div-1").after("Other tag here!!!");
很明显javascript不是纯javascript解决方案。
【讨论】: