2010-09-01 26 views
91

Deseo obtener todo el html de un elemento seleccionado, no solo sus contenidos. .html() usa javascripts método innerHTML() según la documentación. HTML:jQuery, obtener html de un elemento completo

<div id="divs"> 
    <div id="div1"> 
    <p>Some Content</p> 
    </div> 
    <div id="div2"> 
    <p>Some Content</p> 
    </div> 
</div> 

Usando $('#divs:first').html(); devolverá sólo el elemento de párrafo. Quiero obtener el código HTML de todo el elemento, así:

<div id="div1"> 
    <p>Some Content</p> 
    </div> 

no puedo usar .parent porque esto volverá html de los dos divs niño.

Respuesta

171

Puede clonar para obtener todo el contenido, así:

var html = $("<div />").append($("#div1").clone()).html(); 

O que sea un complemento, la mayoría tienden a llamar a este "outerHTML", así:

jQuery.fn.outerHTML = function() { 
    return jQuery('<div />').append(this.eq(0).clone()).html(); 
}; 

Entonces que sólo puede llamar a:

var html = $("#div1").outerHTML(); 
+5

Esta es una gran respuesta, pero realmente apesta que jQuery no implementa su propio método. –

+3

No es perfecto. En caso de que HTML tenga una etiqueta 'script', el código de esta etiqueta se ejecutará cuando se llame a' append'. Puede causar problemas. – Andrej

69

las diferencias podrían no ser significativa en un caso de uso típico, pero utilizando el estándar DOM funcional dad

$("#el")[0].outerHTML 

es aproximadamente dos veces más rápido que

$("<div />").append($("#el").clone()).html(); 

así que iría con:

/* 
* Return outerHTML for the first element in a jQuery object, 
* or an empty string if the jQuery object is empty; 
*/ 
jQuery.fn.outerHTML = function() { 
    return (this[0]) ? this[0].outerHTML : ''; 
}; 
+0

Y si solo desea la etiqueta de apertura: '/ <[^>] +> /. Exec (elem [0] .outerHTML) [0]' – z0r

+0

En mi humilde opinión, esta debería ser la respuesta aceptada, especialmente teniendo en cuenta el impacto de .clone() – gciochina

+0

También me gusta la cadena predeterminada para vaciar en lugar de permitir errores de referencia nulos, agradables y cortos, dulces y estables, gracias. Esto funciona genial para mí –

2

Usted puede conseguir fácilmente propio niño y todos sus descendientes (hijos) con jQuery de Método de clonación (solo)

var child = $('#div div:nth-child(1)').clone(); 

var child2 = $('#div div:nth-child(2)').clone(); 

Obtendrá esto para la primera consulta como se le preguntó en la pregunta

<div id="div1"> 
    <p>Some Content</p> 
</div> 
4

Puede lograrlo con solo un código de línea.

$ ('# divs'). Get (0) .outerHTML;

Tan simple como eso.

+0

Esto funcionó muy bien para mí, gracias. –

-1

escribir su html así:

<div id="element"> 
    <img src="image.jpg"> 
</div> 

entonces la función .html() Obtiene la etiqueta img! y se puede agregar en cualquier lugar :)

Cuestiones relacionadas