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

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.


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

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


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.


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
}


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


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

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


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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.