如何在JavaScript中获取DOM元素的HTML


94

假设我有以下HTML:

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

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

<span>...</span>

有任何想法吗?谢谢

Answers:


87

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

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

我正在克隆该元素,以避免必须删除该元素并将其重新插入到实际文档中。但是,如果您要打印的元素下面有一个很大的树,这可能会很昂贵。


嗨-总的来说,这可能是我最好的选择。对于分离/附加元素有些警惕,我无法破坏DOM,而且我不希望有大树。
理查德H

除非myElement是不能作为div的子元素的元素,例如li,表行或表单元格等。
RobG 2011年

20
现在是2013年,调用“ domnode.outerHTML”可在所有主要浏览器上使用(自v11起为FF)
凯文

87

用途outerHTML

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

2
不,这是IE扩展程序。尽管存在Firefox解决方法:snipplr.com/view/5460/outerhtml-in-firefox
Wim,2009年

1
基于WebKit的浏览器似乎支持它,但是Firefox不支持。
约恩·舒德罗德(JørnSchou-Rode),2009年

2
根据quirksmode.org/dom/w3c_html.html,它应该可以在IE,Opera,Safari和Chrome中运行。
Majkel

18
请注意,outerHTML是HTML5的一部分,因此每个人都应及时支持。
Xanthir


8

首先,放入包裹有div问题的元素,在元素上放置一个id属性,然后getElementById在其上使用:一旦获得了元素,只需执行'e.innerHTML`即可检索HTML。

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

=> <div id="wrap"><div><span><b>This is in bold</b></span></div></div>

然后:

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

请注意outerHTML它与跨浏览器不兼容。


1
为div的父级获取innerHTML的问题是,我还将为div的同级兄弟获取innerHTML
Richard H

不好,我认为“将id属性放在元素上”是指“元素”。有了上次编辑是一个更加清晰要额外添加div到汤:)
约恩休乌-罗德

@JP:如果元素不在document...中,那么它在哪里,您是否愿意启发我们所有人?
jldupont

@JP:您当然可以在所需的位置创建元素,但这并不是拒绝投票的理由...您不会以这种态度在这里结识很多朋友。
jldupont

可以肯定的是,outerHTML已经跨浏览器兼容了很长时间了-不要害怕使用它。
下雪时间

3

如果您希望使用更轻便的脚本,但需要更长的脚本,请获取元素innerHTML,然后仅创建并克隆空的父级-

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
}


2

由于externalHTML仅是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;
}

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


2

您将需要类似这样的东西才能跨浏览器。

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

    return container.innerHTML;
}

1
这会element在调用时从文档中删除,对吧?
约恩·舒德罗德(JørnSchou-Rode),2009年

现在可以通过添加cloneNode来解决此问题,这使其与此处的其他一些答案几乎相同。
尼古拉斯·斯蒂芬,


0

基于对element.outerHTML的支持来定义函数externalHTML:

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

-2
var el = document.getElementById('foo');
el.parentNode.innerHTML;

4
这也会给我div的兄弟姐妹的任何HTML,对吧?
理查德H

否决票是怎么回事?最初的问题与兄弟姐妹无关。给定问题的原始上下文,该答案是一个非常有效的答案。
杰森·勒维耶

另一方面,最初的问题与父母无关。所以,随便
杰森·勒维耶
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.