jQuery obtiene html de contenedor, incluido el contenedor en sí

156

¿Cómo obtengo el html en '#container' que incluye '#container' y no solo lo que hay dentro?

<div id="container">
 <div id="one">test 1 </div>
 <div id="two">test 2 </div>
 <div id="three">test 3 </div>
 <div id="four">test 4 </div>
</div>

Tengo esto que obtiene el html dentro de #container. no incluye el elemento #container en sí. Eso es lo que estoy buscando hacer

var x = $('#container').html();
$('#save').val(x);

Verifique http://jsfiddle.net/rzfPP/58/

Dedo meñique
fuente
podrías poner el contenedor dentro de otro contenedor y obtener esos contenedores html ... pero eso parece un poco hacky. quizás si supiéramos un poco más sobre el problema, ¿podríamos llegar a una solución viable? ¿Qué estás haciendo con un área de texto llena de HTML?
Patricia
posible duplicado del HTML externo del elemento seleccionado
Ian Mackinnon

Respuestas:

160

Si envuelve el contenedor en una Petiqueta ficticia , también obtendrá el HTML del contenedor.

Todo lo que necesitas hacer es

var x = $('#container').wrap('<p/>').parent().html();

Consulte el ejemplo de trabajo en http://jsfiddle.net/rzfPP/68/

A unwrap()la <p>etiqueta cuando haya terminado, puede agregar

$('#container').unwrap();
Hussein
fuente
19
@ mc10 simplemente podemos usar clone () y no tendrá que preocuparse por los elementos adicionales creados. var x = $('#container').clone().wrap('<p/>').parent().html();. La idea de envoltura es genial y mucho menos complicada que la mayoría de las soluciones proporcionadas.
Pinkie
El problema de Firefox está desactualizado, así que sugiero votar la respuesta @MikeM porque está en JS puro.
Rob
66
¿Por qué una <p>etiqueta? ¿No <div>tendría más sentido?
Martin Burch
66
Esto tiene una solución mucho más simple. Mira mi respuesta.
1.44mb
132
var x = $('#container').get(0).outerHTML;

ACTUALIZACIÓN : Esto ahora es compatible con Firefox a partir de FireFox 11 (marzo de 2012)

Como otros han señalado, esto no funcionará en Firefox. Si necesita que funcione en FireFox, puede que desee echar un vistazo a la respuesta a esta pregunta: en jQuery, ¿hay alguna función similar a html () o text () pero devuelve todo el contenido del componente coincidente?

ShaneBlake
fuente
66
Esto funciona en Firefox, y es mejor que la solución aceptada a partir de ahora.
luqita
esta es una forma elegante de hacerlo, mejor que la respuesta aceptada, que fue solo un truco sucio
minhajul
Esto es perfecto.
Gaurav Aggarwal
esta es la respuesta perfecta porque envolver la etiqueta principal con div o p es una mala idea. puede ser tu CSS se romperá. especialmente cuando usa bootstrap (por ejemplo, form-row). Por lo tanto, esta respuesta es bastante buena.
Sudhir K Gupta
73

Me gusta usar esto;

$('#container').prop('outerHTML');
1.44mb
fuente
77
Esta parece ser la mejor solución para mí, no requiere manipulación de dom o pseudo manipulación de dom (los métodos de ajuste). Y el objeto jquery ya tiene la propiedad.
Nieminen
1
encanta esta solución
Sameera Kumarasingha
69
var x = $('#container')[0].outerHTML;
MikeM
fuente
1
El problema de Firefox está desactualizado, así que sugiero votar esta respuesta.
Rob
1
Usar .clone () funciona, pero esto es mucho más limpio, en mi opinión. La respuesta aceptada crea nuevos elementos en el DOM = malo.
Peter
13
$('#container').clone().wrapAll("<div/>").parent().html();

Actualización: externalHTML funciona en Firefox ahora, así que usa la otra respuesta a menos que necesites soportar versiones muy antiguas de Firefox

Robert Noack
fuente
La propiedad externalHTML no funciona en Firefox, por lo que debe hacerlo con clon
Robert Noack
2

Viejo pero valioso...

Como el usuario solicita jQuery, lo voy a mantener simple:

var html = $('#container').clone();
console.log(html);

Violín aquí.

prinsen
fuente
2
Esto no ayuda a recuperar el html del contenedor en sí. Ni siquiera devuelve el código html. Puedo ver que puede ser práctico acceder al nodo objetivo a través de un clon para evitar modificar el dom, pero sería bueno mencionar por qué usa este método.
AeonOfTime
0

Firefox no es compatible con externalHTML , por lo que debe definir una función para ayudarlo:

function outerHTML(node) {
    return node.outerHTML || (
        function(n) {
            var div = document.createElement('div');
            div.appendChild( n.cloneNode(true) );
            var h = div.innerHTML;
            div = null;
            return h;
        }
    )(node);
}

Luego, puede usar outsideHTML:

var x = outerHTML($('#container').get(0));
$('#save').val(x);
kevinji
fuente
0
var x = $($('div').html($('#container').clone())).html();
kei
fuente
66
Está creando 3 objetos jquery en una declaración. Aunque funciona, es una exageración.
Pinkie
-2

Solución simple con un ejemplo:

<div id="id_div">
  <p>content<p>
</div>

Mueva este DIV a otro DIV con id = "other_div_id"

$('#other_div_id').prepend( $('#id_div') );

Terminar

hassane86
fuente
El OP está solicitando el HTML sin procesar representado por un objeto jQuery, donde este método mueve un objeto jQuery de un lugar a otro.
Simon Robb