103 votes

Comment obtenir le code HTML d'un élément du DOM en javascript ?

Imaginez que j'ai le HTML suivant :

<div><span><b>This is in bold</b></span></div>

Je veux obtenir le code HTML de la division, y compris la division elle-même. Element.innerHTML ne renvoie que :

<span>...</span>

Des idées ? Merci

100voto

Majkel Points 763

Utilisez outerHTML :

var el = document.getElementById( 'foo' );
alert( el.outerHTML );

2 votes

Non, c'est une extension d'IE. Bien qu'il existe des solutions de contournement pour Firefox : snipplr.com/view/5460/outerhtml-in-firefox

0 votes

C'est certainement ce dont j'ai besoin bien qu'il s'agisse apparemment d'une extension IE. Je suis dans un environnement WebKit - je teste maintenant. Merci.

1 votes

Les navigateurs basés sur WebKit semblent le prendre en charge, mais pas Firefox.

91voto

Jørn Schou-Rode Points 19947

Dans le prolongement de la réponse de jldupont, vous pouvez créer un élément d'habillage à la volée :

var target = document.getElementById('myElement');
var wrap = document.createElement('div');
wrap.appendChild(target.cloneNode(true));
alert(wrap.innerHTML);

Je clone l'élément pour éviter de devoir le supprimer et le réinsérer dans le document réel. Cela peut cependant s'avérer coûteux si l'élément que vous souhaitez imprimer possède une très grande arborescence en dessous de lui.

0 votes

Je me méfie un peu des éléments à détacher ou à attacher, mais je ne peux pas bousiller le DOM et je ne m'attends pas à ce qu'il y ait de grands arbres.

0 votes

Sauf si monÉlément est un élément qui ne peut pas être un enfant d'un div, comme un li, une ligne de tableau ou une cellule de tableau, etc.

21 votes

Maintenant que nous sommes en 2013, appeler "domnode.outerHTML" fonctionne sur tous les principaux navigateurs (FF depuis la v11).

10voto

jldupont Points 31331

D'abord, mettez un élément qui enveloppe le div en question, mettez un id sur l'élément, puis utiliser l'attribut getElementById une fois que vous avez lement, il suffit de faire 'e.innerHTML' pour récupérer le 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>

et ensuite :

var e=document.getElementById("wrap");
var content=e.innerHTML;

Note que outerHTML n'est pas compatible avec les navigateurs.

1 votes

Le problème de récupérer le innerHTML du parent de la div est que je vais aussi récupérer le innerHTML des frères et sœurs de la div.

0 votes

C'est ma faute, je pensais que "mettre un attribut id sur l'élément" faisait référence à "l'élément". Avec votre dernière modification, il est beaucoup plus clair que vous voulez ajouter un attribut supplémentaire div à la soupe :)

0 votes

@J-P : si l'élément n'est pas dans le document ... alors où est-il, pouvez-vous nous éclairer ?

3voto

Nikolas Stephan Points 605

Vous aurez besoin de quelque chose comme ça pour qu'il soit compatible avec tous les navigateurs.

function OuterHTML(element) {
    var container = document.createElement("div");
    container.appendChild(element.cloneNode(true));

    return container.innerHTML;
}

1 votes

Cela permettrait de supprimer element du document lorsqu'il est appelé, n'est-ce pas ?

0 votes

Il aurait corrigé cela maintenant en ajoutant cloneNode, ce qui le rend pratiquement identique à certaines des autres réponses ici.

2voto

Zenon Points 792

Comme outerHTML est uniquement IE, utilisez cette fonction :

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

crée un faux élément vide du type parent et utilise innerHTML sur celui-ci, puis rattache l'élément au dom normal

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X