Como obter o HTML para um elemento DOM em javascript

94

Imagine que tenho o seguinte HTML:

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

Quero obter o HTML para o div, incluindo o próprio div. Element.innerHTML retorna apenas:

<span>...</span>

Alguma ideia? obrigado

Richard H
fonte

Respostas:

87

Expandindo a resposta de jldupont, você pode criar um elemento de embrulho instantaneamente:

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

Estou clonando o elemento para evitar ter que remover e reinserir o elemento no documento real. Isso pode ser caro se o elemento que você deseja imprimir tiver uma árvore muito grande abaixo dele.

Jørn Schou-Rode
fonte
oi - no balanço, esta é provavelmente minha melhor opção. um pouco desconfiado de desanexar / anexar elementos, não posso bagunçar o DOM e não espero que haja árvores grandes.
Richard H
A menos que myElement seja um elemento que não pode ser filho de um div, como li, table row ou table cell e assim por diante.
RobG de
20
Agora que é 2013, chamar "domnode.outerHTML" funciona em todos os principais navegadores (FF desde a v11)
Kevin
87

Use outerHTML:

var el = document.getElementById( 'foo' );
alert( el.outerHTML );
Majkel
fonte
2
Não, é uma extensão do IE. Embora existam soluções alternativas para o Firefox: snipplr.com/view/5460/outerhtml-in-firefox
Wim
1
Os navegadores baseados em WebKit parecem suportá-lo, mas o Firefox não.
Jørn Schou-Rode
2
De acordo com quirksmode.org/dom/w3c_html.html , deve funcionar no IE, Opera, Safari e Chrome.
Majkel
18
Observe que outerHTML é parte do HTML5 e, portanto, deve ser compatível com o tempo.
Xanthir
7
outerHTMLé compatível desde FF11: developer.mozilla.org/en-US/docs/Web/API/element.outerHTML .
Felix Kling
8

Primeiro, coloque o elemento que envolve o divem questão, coloque um idatributo no elemento e use getElementByIdnele: uma vez que você tenha o elemento, apenas faça 'e.innerHTML` para recuperar o 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>

e depois:

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

Observe que outerHTMLnão é compatível com navegadores diferentes.

jldupont
fonte
1
o problema de obter o innerHTML para o pai do div é que também vou obter o innerHTML para os irmãos do div
Richard H
Que pena, pensei que o "colocar um atributo id no elemento" se referia a "o elemento". Com sua última edição, é muito mais claro que você deseja adicionar um suplemento divà sopa :)
Jørn Schou-Rode
@JP: se o elemento não está no document... então onde está, você se importa em nos iluminar a todos?
jldupont de
@JP: claro que você pode criar elementos onde quiser, mas isso não é motivo para um voto negativo ... você não fará muitos amigos por aqui com esse tipo de atitude.
jldupont
Com certeza o outerHTML é compatível com vários navegadores há muito, muito tempo - não tenha medo de usá-lo.
Neve de
3

Se você quiser uma pegada mais leve, mas um script mais longo, pegue os elementos innerHTML e apenas crie e clone o pai vazio

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
}
kennebec
fonte
3
var x = $('#container').get(0).outerHTML;
Pawan Jasoria
fonte
2

como outerHTML é apenas IE, use esta função:

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

cria um elemento vazio falso do tipo pai e usa innerHTML nele e, em seguida, reconecta o elemento de volta ao dom normal

Zenon
fonte
2

Você vai querer algo assim para que seja cross-browser.

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

    return container.innerHTML;
}
Nikolas Stephan
fonte
1
Isso removeria elementdo documento quando chamado, certo?
Jørn Schou-Rode
Ele teria corrigido isso agora, adicionando cloneNode, o que o torna praticamente idêntico a algumas das outras respostas aqui.
Nikolas Stephan
1

velha pergunta, mas para os recém-chegados que aparecem:

document.querySelector('div').outerHTML

Pery Mimon
fonte
0

definir a função outerHTML com base no suporte para element.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;
    };
  };
Remi
fonte
-2
var el = document.getElementById('foo');
el.parentNode.innerHTML;
Jason Leveille
fonte
4
isso também me dará qualquer html para os irmãos do div, certo?
Richard H
O que há com o voto negativo? A pergunta original não tinha nada a ver com irmãos. Essa resposta foi uma resposta perfeitamente válida, dado o contexto original da pergunta.
Jason Leveille
Por outro lado, a pergunta original não tinha nada a ver com um dos pais. Então tanto faz.
Jason Leveille