jQuery obtém html de container incluindo o próprio container

156

Como obtenho o html no '#container' incluindo '#container' e não apenas no conteúdo.

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

Eu tenho isso que recebe o html dentro de #container. ele não inclui o próprio elemento #container. É isso que estou procurando fazer

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

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

Pinkie
fonte
você pode colocar o contêiner dentro de outro contêiner e obter o contêiner html ... mas isso parece um pouco hacky. talvez se soubéssemos um pouco mais sobre o problema, poderíamos encontrar uma solução viável? o que você está fazendo com uma área de texto cheia de html?
Patricia
possível duplicata de HTML externa do elemento selecionado
Ian Mackinnon

Respostas:

160

Se você envolver o contêiner em uma Ptag fictícia, também receberá o HTML do contêiner.

Tudo que você precisa fazer é

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

Veja o exemplo de trabalho em http://jsfiddle.net/rzfPP/68/

Para unwrap()a <p>tag quando feito, você pode adicionar

$('#container').unwrap();
Hussein
fonte
19
@ mc10 podemos simplesmente usar clone () e você não terá que se preocupar com elementos extras criados. var x = $('#container').clone().wrap('<p/>').parent().html();. A idéia de quebrar é ótima e menos complicada do que a maioria das soluções fornecidas.
Pinkie
A questão do Firefox está desatualizada, por isso sugiro votar na resposta do @MikeM porque está em JS puro.
Rob
6
Por que uma <p>tag? Não <div>faria mais sentido?
Martin Burch
6
Isso tem uma solução muito mais simples. Veja minha resposta.
1.44mb
132
var x = $('#container').get(0).outerHTML;

ATUALIZAÇÃO : agora é suportado pelo Firefox a partir do FireFox 11 (março de 2012)

Como outros já apontaram, isso não funcionará no FireFox. Se você precisar que ele funcione no FireFox, poderá dar uma olhada na resposta a esta pergunta: No jQuery, existe alguma função semelhante a html () ou text (), mas retorna todo o conteúdo do componente correspondente?

ShaneBlake
fonte
6
Isso funciona no Firefox e é melhor que a solução aceita a partir de agora.
luqita
esta é uma maneira elegante de fazer isso, melhor, então a resposta aceita que era apenas um truque sujo
minhajul
Isto é perfeito.
Gaurav Aggarwal
esta é a resposta perfeita, pois agrupar a tag pai com div ou p é uma má ideia. pode ser que seu css se quebre. especialmente quando você estiver usando o bootstrap (por exemplo, linha de formulário). portanto, essa resposta é muito boa.
Sudhir K Gupta
73

Eu gosto de usar isso;

$('#container').prop('outerHTML');
1.44mb
fonte
7
Essa parece ser a melhor solução para mim, não requer manipulação de dom ou manipulação de pseudo-dom (os métodos de quebra). E o objeto jquery já possui a propriedade
197 Nieminen
1
amo esta solução
Sameera Kumarasingha
69
var x = $('#container')[0].outerHTML;
MikeM
fonte
1
O problema do Firefox está desatualizado, por isso sugiro que vote nesta resposta.
Rob
1
Usar .clone () funciona, mas isso é muito mais limpo, imo. A resposta aceita cria novos elementos no DOM = inválido.
pete 15/03
13
$('#container').clone().wrapAll("<div/>").parent().html();

Atualização: outerHTML funciona no firefox agora, então use a outra resposta, a menos que você precise oferecer suporte a versões muito antigas do firefox

Robert Noack
fonte
outerHTML propriedade não funciona no Firefox, então você precisa fazê-lo com clone
Robert Noack
2

Oldie but goldie ...

Como o usuário está solicitando jQuery, vou mantê-lo simples:

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

Violino aqui.

prinsen
fonte
2
Isso não ajuda a recuperar o html do próprio contêiner. Ele nem retorna o código html. Percebo que pode ser prático acessar o nó de destino via clone para evitar a modificação do dom, mas seria bom mencionar por que você usa esse método.
AeonOfTime
0

O Firefox não oferece suporte a outerHTML , portanto, você precisa definir uma função para ajudá-lo:

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

Em seguida, você pode usar outerHTML:

var x = outerHTML($('#container').get(0));
$('#save').val(x);
kevinji
fonte
0
var x = $($('div').html($('#container').clone())).html();
kei
fonte
6
Você está criando 3 objetos jquery em uma instrução. Embora funcione, é um exagero.
23711 Pinkie
-2

Solução simples com um exemplo:

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

Mova este DIV para outro DIV com id = "other_div_id"

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

Terminar

hassane86
fonte
O OP está solicitando o HTML bruto representado por um objeto jQuery, em que esse método move um objeto jQuery de um local para outro.
Simon Robb