【问题标题】:How to get the HTML for a DOM element in javascript如何在 javascript 中获取 DOM 元素的 HTML
【发布时间】:2010-12-18 07:42:31
【问题描述】:

假设我有以下 HTML:

<div><span><b>This is in bold</b></span></div>

我想获取 div 的 HTML,包括 div 本身。 Element.innerHTML 只返回:

<span>...</span>

有什么想法吗?谢谢

【问题讨论】:

    标签: javascript html dom


    【解决方案1】:

    使用outerHTML

    var el = document.getElementById( 'foo' );
    alert( el.outerHTML );
    

    【讨论】:

    【解决方案2】:

    扩展 jldupont 的答案,您可以动态创建一个包装元素:

    var target = document.getElementById('myElement');
    var wrap = document.createElement('div');
    wrap.appendChild(target.cloneNode(true));
    alert(wrap.innerHTML);
    

    我正在克隆元素以避免在实际文档中删除并重新插入元素。但是,如果您要打印的元素下方有一棵非常大的树,这可能会很昂贵。

    【讨论】:

    • 嗨 - 总的来说,这可能是我最好的选择。对分离/附加元素有点警惕,我不能搞砸 DOM,我不希望有大树。
    • 除非 myElement 是不能是 div 的子元素的元素,例如 li、表格行或表格单元格等。
    • 现在是 2013 年,调用“domnode.outerHTML”适用于所有主流浏览器(自 v11 起为 FF)
    【解决方案3】:

    首先,放置包含相关div 的元素,在元素上放置id 属性,然后在其上使用getElementById:一旦你得到了元素,只需执行“e.innerHTML”检索 HTML。

    &lt;div&gt;&lt;span&gt;&lt;b&gt;This is in bold&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;

    => &lt;div id="wrap"&gt;&lt;div&gt;&lt;span&gt;&lt;b&gt;This is in bold&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;

    然后:

    var e=document.getElementById("wrap");
    var content=e.innerHTML;
    

    注意outerHTML 不兼容跨浏览器。

    【讨论】:

    • 获取 div 父级的 innerHTML 的问题是我还要获取 div 的兄弟姐妹的 innerHTML
    • 我的错,我认为“在元素上放置一个 id 属性”指的是“元素”。通过您的最后一次编辑,您想在汤中添加额外的div 就更清楚了:)
    • @J-P:如果元素不在document...那它在哪里,你愿意赐教吗?
    • @JP:当然你可以在你想要的地方创建元素,但这是拒绝投票的理由......你不会在这里结交很多朋友那种态度。
    • 非常确定outerHTML已经跨浏览器兼容很久了——不要害怕使用它。
    【解决方案4】:

    老问题,但对于新来的人来说:

    document.querySelector('div').outerHTML

    【讨论】:

      【解决方案5】:

      你会想要这样的东西才能跨浏览器。

      function OuterHTML(element) {
          var container = document.createElement("div");
          container.appendChild(element.cloneNode(true));
      
          return container.innerHTML;
      }
      

      【讨论】:

      • 这会在调用时从文档中删除element,对吧?
      • 现在可以通过添加 cloneNode 来解决这个问题,这使得它与此处的其他一些答案几乎相同。
      【解决方案6】:

      如果你想要一个更轻的足迹,但更长的脚本,获取元素 innerHTML 并且只创建和克隆 empty 父级-

      function getHTML(who,lines){
          if(!who || !who.tagName) return '';
      
          var txt, ax, str, el= document.createElement('div');
          el.appendChild(who.cloneNode(false));
          txt= el.innerHTML;
          ax= txt.indexOf('>')+1;
          str= txt.substring(0, ax)+who.innerHTML+ txt.substring(ax);
      
          el= null;
          return lines? str.replace(/> *</g,'>\n<'): str;
          //easier to read if elements are separated
      }
      

      【讨论】:

        【解决方案7】:
        var x = $('#container').get(0).outerHTML;
        

        【讨论】:

        • 考虑添加为什么这是最好的解决方案,因为 OP 从未提及 jquery
        【解决方案8】:

        由于outerHTML 仅适用于IE,请使用此功能:

        function getOuterHtml(node) {
            var parent = node.parentNode;
            var element = document.createElement(parent.tagName);
            element.appendChild(node);
            var html = element.innerHTML;
            parent.appendChild(node);
            return html;
        }
        

        创建一个类型为 parent 的虚假空元素并在其上使用 innerHTML,然后将该元素重新附加到正常的 dom 中

        【讨论】:

          【解决方案9】:

          根据对element.outerHTML的支持定义函数outerHTML:

          var temp_container = document.createElement("div"); // empty div not added to DOM
          if (temp_container.outerHTML){
              var outerHTML = function(el){return el.outerHTML||el.nodeValue} // e.g. textnodes do not have outerHTML
            } else { // when .outerHTML is not supported
              var outerHTML = function(el){
                var clone = el.cloneNode(true);
                temp_container.appendChild(clone);
                outerhtml = temp_container.innerHTML;
                temp_container.removeChild(clone);
                return outerhtml;
              };
            };
          

          【讨论】:

            【解决方案10】:
            var el = document.getElementById('foo');
            el.parentNode.innerHTML;
            

            【讨论】:

            • 这也会给我 div 的兄弟姐妹的任何 html 对吗?
            • 投反对票是怎么回事?最初的问题与兄弟姐妹无关。考虑到问题的原始上下文,这个答案是一个完全有效的答案。
            • 另一方面,最初的问题与父母无关。所以,无论如何。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-16
            • 1970-01-01
            • 2021-02-17
            • 2022-10-15
            • 1970-01-01
            相关资源
            最近更新 更多