【问题标题】:How to insert HTML string in between two DOM nodes?如何在两个 DOM 节点之间插入 HTML 字符串?
【发布时间】: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


    【解决方案1】:

    大部分浏览器都支持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);
    }
    

    现场示例:http://jsfiddle.net/AndyE/jARTf/

    【讨论】:

      【解决方案2】:

      这适用于纯文本,这就是我阅读您原始问题的方式(有关包含标签的字符串的更新,请参见下文):

      var div = document.getElementById('div-2');
      var textNode = document.createTextNode('your text');
      div.parentNode.insertBefore(textNode, div);
      

      Live example

      如果你开始:

      <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);
      }
      

      Live example

      W3C 文档链接:insertBeforecreateTextNode

      包括 HTML 标签

      在您修改后的问题中,您说过您希望在执行所有这些操作时包含要解释的标签。这是可能的,但它是迂回的。首先将 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;
      }
      

      Live example

      但是这里有龙,您必须根据要插入的内容选择容器元素。例如,我们不能在上面的代码中使用&lt;tr&gt;,因为我们将它插入div,而不是tbody,所以这是无效的,结果是特定于实现的。这些复杂性是我们有图书馆来帮助我们的原因。您要求提供原始 DOM 答案,这就是上面的内容,但我真的会查看 jQueryClosurePrototypeYUIany of several others。他们会为你解决很多问题。

      【讨论】:

      • 也许我不明白你,但这正是我试图避免的,将 HTML 字符串包装到标签中。
      • "不将其包装在另一个通过 document.createElement 创建的 div 中"
      • @actual:已修复,误读抱歉。这是完全相同的概念,只是带有一个文本节点而不是一个元素。
      • 不幸的是,HTML 标记在文本节点内是 not working
      • @actual:不,他们不会——这是文本节点的一部分。我看到你已经编辑了你的问题。好的,第三次编辑来了,这可能的,只是很痛苦。
      【解决方案3】:
      var neuB = document.createElement("b");
      var neuBText = document.createTextNode("mit fettem Text ");
      neuB.appendChild(neuBText);
      document.getElementById("derText").insertBefore(neuB, document.getElementById("derKursiveText"));
      

      您搜索:insertBefore

      【讨论】:

        【解决方案4】:

        使用 jquery 很简单:

        $("#div-1").after("Other tag here!!!");
        

        见:jquery.after

        很明显javascript不是纯javascript解决方案。

        【讨论】:

        • 如何将其转化为纯 JS + DOM?
        • 上次我看 jQuery 是用 javascript 编写的 :)
        • 在 SO 上看到大多数 JS 答案都涉及 jQuery,它几乎就像 jQuery==JavaScript ;)(但仍然不是 ===)
        • @mplungjan:然而,用纯 jQuery 答案来回答 JavaScript / HTML / DOM 问题是不恰当和不正确的。 (可以给出一个纯 JS 的答案,然后说“但是如果你使用库 X,这会更容易”。)
        • true - 我在网上和其他地方看到很多答案,甚至都懒得提 jQuery,只是给出了 jQuery 的例子。这就是生活;)
        猜你喜欢
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多