Cómo obtener el HTML para un elemento DOM en javascript

94

Imagina que tengo el siguiente HTML:

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

Quiero obtener el HTML para el div, incluido el div en sí. Element.innerHTML solo devuelve:

<span>...</span>

¿Algunas ideas? Gracias

Richard H
fuente

Respuestas:

87

Ampliando la respuesta de jldupont, puede crear un elemento de envoltura sobre la marcha:

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

Estoy clonando el elemento para evitar tener que quitar y volver a insertar el elemento en el documento real. Sin embargo, esto puede resultar caro si el elemento que desea imprimir tiene un árbol muy grande debajo.

Jørn Schou-Rode
fuente
hola - a fin de cuentas esta es probablemente mi mejor opción. un poco cauteloso de separar / adjuntar elementos, no puedo arruinar el DOM, y no espero que haya árboles grandes.
Richard H
A menos que myElement sea ​​un elemento que no puede ser hijo de un div, como li, fila de tabla o celda de tabla, etc.
RobG
20
Ahora que estamos en 2013, llamar a "domnode.outerHTML" funciona en todos los navegadores principales (FF desde v11)
Kevin
87

Utilizar outerHTML:

var el = document.getElementById( 'foo' );
alert( el.outerHTML );
Majkel
fuente
2
No, es una extensión de IE. Aunque existen soluciones alternativas para Firefox: snipplr.com/view/5460/outerhtml-in-firefox
Wim
1
Los navegadores basados ​​en WebKit parecen admitirlo, pero Firefox no.
Jørn Schou-Rode
2
Según quirksmode.org/dom/w3c_html.html debería funcionar en IE, Opera, Safari y Chrome.
Majkel
18
Tenga en cuenta que el HTML externo es parte de HTML5 y, por lo tanto, todos deberían admitirlo a tiempo.
Xanthir
7
outerHTMLes compatible desde FF11: developer.mozilla.org/en-US/docs/Web/API/element.outerHTML .
Felix Kling
8

Primero, coloque el elemento que envuelve el elemento diven cuestión, coloque un idatributo en el elemento y luego getElementByIdúselo: una vez que tenga el elemento, simplemente haga 'e.innerHTML` para recuperar el 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>

y entonces:

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

Tenga en cuenta que outerHTMLno es compatible con varios navegadores.

jldupont
fuente
1
el problema con obtener el innerHTML para el padre del div es que también obtendré el innerHTML para los hermanos del div
Richard H
Mi mal, pensé que "poner un atributo de identificación en el elemento" se refería a "el elemento". Con su última edición, está mucho más claro que desea agregar un adicional diva la sopa :)
Jørn Schou-Rode
@JP: si el elemento no está en document... entonces ¿dónde está, te importa iluminarnos a todos?
jldupont
@JP: por supuesto que puedes crear elementos donde quieras, pero esto no es motivo para un voto negativo ... no harás muchos amigos por aquí con ese tipo de actitud.
jldupont
Estoy bastante seguro de que HTML externo ha sido compatible con varios navegadores durante mucho, mucho tiempo, no tenga miedo de usarlo.
Nieve
3

Si quieres una huella más ligera, pero un guión más largo, obtener los elementos innerHTML y sólo crear y clonar el vacío entre padres

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

como externalHTML es solo IE, use esta función:

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

crea un elemento vacío falso del tipo parent y usa innerHTML en él y luego vuelve a adjuntar el elemento al dom normal

Zenon
fuente
2

Querrá algo como esto para que sea entre navegadores.

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

    return container.innerHTML;
}
Nikolas Stephan
fuente
1
Esto se eliminaría elementdel documento cuando se llama, ¿verdad?
Jørn Schou-Rode
Lo habría solucionado ahora al agregar cloneNode, lo que lo hace prácticamente idéntico a algunas de las otras respuestas aquí.
Nikolas Stephan
1

pregunta anterior, pero para los recién llegados que se acercan:

document.querySelector('div').outerHTML

pery mimon
fuente
0

definir la función outerHTML basado en el soporte 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
fuente
-2
var el = document.getElementById('foo');
el.parentNode.innerHTML;
Jason Leveille
fuente
4
esto también me dará html para los hermanos del div, aunque ¿verdad?
Richard H
¿Qué pasa con el voto negativo? La pregunta original no tenía nada que ver con los hermanos. Esta respuesta fue una respuesta perfectamente válida dado el contexto original de la pregunta.
Jason Leveille
Por otro lado, la pregunta original no tenía nada que ver con un padre. Lo que sea.
Jason Leveille