jQuery récupère le code HTML du conteneur, y compris le conteneur lui-même

156

Comment obtenir le code HTML sur '#container', y compris '#container' et pas seulement ce qu'il contient.

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

J'ai ceci qui obtient le html dans #container. il n'inclut pas l'élément #container lui-même. C'est ce que je cherche à faire

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

Vérifiez http://jsfiddle.net/rzfPP/58/

Auriculaire
la source
vous pourriez mettre le conteneur dans un autre conteneur et obtenir ce conteneur html ... mais cela semble un peu piraté. peut-être que si nous en savions un peu plus sur le problème, nous pourrions trouver une solution viable? que faites-vous avec une zone de texte pleine de html?
Patricia
duplication possible du HTML externe de l'élément Get selected
Ian Mackinnon

Réponses:

160

Si vous enveloppez le conteneur dans une Pbalise factice, vous obtiendrez également le code HTML du conteneur.

Tout ce que tu as à faire c'est

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

Vérifiez l'exemple de travail sur http://jsfiddle.net/rzfPP/68/

Pour unwrap()l' <p>étiquette lorsque vous avez terminé, vous pouvez ajouter

$('#container').unwrap();
Hussein
la source
19
@ mc10 nous pouvons simplement utiliser clone () et vous n'aurez pas à vous soucier des éléments supplémentaires créés. var x = $('#container').clone().wrap('<p/>').parent().html();. L'idée de wrap est géniale et alloue moins compliquée que la plupart des solutions proposées.
Pinkie
Le problème de Firefox est obsolète, je suggère donc de voter pour la réponse @MikeM car elle est en JS pur.
Rob
6
Pourquoi une <p>balise? Cela n'aurait-il pas <div>plus de sens?
Martin Burch
6
Cela a une solution beaucoup plus simple. Voyez ma réponse.
1,44 Mo le
132
var x = $('#container').get(0).outerHTML;

MISE À JOUR : Ceci est maintenant pris en charge par Firefox à partir de FireFox 11 (mars 2012)

Comme d'autres l'ont souligné, cela ne fonctionnera pas dans FireFox. Si vous en avez besoin pour fonctionner dans FireFox, vous voudrez peut-être jeter un coup d'œil à la réponse à cette question: dans jQuery, existe-t-il une fonction similaire à html () ou text () mais qui renvoie tout le contenu du composant correspondant?

ShaneBlake
la source
6
Cela fonctionne dans Firefox, et c'est mieux que la solution acceptée pour le moment.
luqita
c'est une façon élégante de le faire, mieux que la réponse acceptée qui n'était qu'un sale hack
minhajul
C'est parfait.
Gaurav Aggarwal
c'est la réponse parfaite car encapsuler la balise parent avec div ou p est une mauvaise idée. peut-être que votre css se cassera. spécialement lorsque vous utilisez bootstrap (par exemple form-row). donc cette réponse est assez bonne.
Sudhir K Gupta
73

J'aime utiliser ceci;

$('#container').prop('outerHTML');
1,44 Mo
la source
7
Cela me semble être la meilleure solution, ne nécessite aucune manipulation de dom, ou pseudo-manipulation de dom (les méthodes wrap). Et l'objet jquery a déjà la propriété.
Nieminen
1
j'aime cette solution
Sameera Kumarasingha
69
var x = $('#container')[0].outerHTML;
MikeM
la source
1
Le problème de Firefox est obsolète, je suggère donc de voter pour cette réponse.
Rob
1
Utiliser .clone () fonctionne, mais c'est beaucoup plus propre, imo. La réponse acceptée crée de nouveaux éléments dans le DOM = bad.
pete
13
$('#container').clone().wrapAll("<div/>").parent().html();

Mise à jour: externalHTML fonctionne maintenant sur Firefox, alors utilisez l'autre réponse à moins que vous n'ayez besoin de prendre en charge de très anciennes versions de Firefox

Robert Noack
la source
La propriété externalHTML ne fonctionne pas sur Firefox, vous devez donc le faire avec clone
Robert Noack
2

Oldie mais goldie ...

Puisque l'utilisateur demande jQuery, je vais rester simple:

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

Violon ici.

Prinsen
la source
2
Cela n'aide pas à récupérer le html du conteneur lui-même. Il ne renvoie même pas de code html. Je peux voir qu'il peut être pratique d'accéder au nœud cible via un clone pour éviter de modifier le dom, mais il serait alors bon de mentionner pourquoi vous utilisez cette méthode.
AeonOfTime
0

Firefox ne prend pas en charge externalHTML , vous devez donc définir une fonction pour aider à le prendre en charge:

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

Ensuite, vous pouvez utiliser externalHTML:

var x = outerHTML($('#container').get(0));
$('#save').val(x);
kevinji
la source
0
var x = $($('div').html($('#container').clone())).html();
kei
la source
6
Vous créez 3 objets jquery dans une seule instruction. Bien que cela fonctionne, c'est exagéré.
Pinkie
-2

Solution simple avec un exemple:

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

Déplacez ce DIV vers un autre DIV avec id = "other_div_id"

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

terminer

hassane86
la source
L'OP demande le HTML brut représenté par un objet jQuery, où cette méthode déplace un objet jQuery d'un endroit à un autre.
Simon Robb