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


94

Imaginez que j'ai le code HTML suivant:

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

Je veux obtenir le HTML pour le div, y compris le div lui-même. Element.innerHTML renvoie uniquement:

<span>...</span>

Des idées? Merci

Réponses:


87

En développant la réponse de jldupont, vous pouvez créer un élément d'emballage à la volée:

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

Je cloné l'élément pour éviter d'avoir à supprimer et réinsérer l'élément dans le document réel. Cela peut être coûteux si l'élément que vous souhaitez imprimer a un très grand arbre en dessous, cependant.


salut - dans l'ensemble, c'est probablement ma meilleure option. un peu méfiant de détacher / attacher des éléments, je ne peux pas bousiller le DOM, et je ne m'attends pas à ce qu'il y ait de grands arbres.
Richard H

Sauf si myElement 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.
RobG

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

87

Utilisez outerHTML:

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

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

1
Les navigateurs basés sur WebKit semblent le prendre en charge, mais pas Firefox.
Jørn Schou-Rode

2
Selon quirksmode.org/dom/w3c_html.html, cela devrait fonctionner dans IE, Opera, Safari et Chrome.
Majkel

18
Notez que externalHTML fait partie de HTML5 et devrait donc être pris en charge par tout le monde à temps.
Xanthir

7
outerHTMLest pris en charge depuis FF11: developer.mozilla.org/en-US/docs/Web/API/element.outerHTML .
Felix Kling

8

Tout d'abord, mettez l'élément qui encapsule l'élément diven question, mettez un idattribut sur l'élément et utilisez- getElementByIdle ensuite: une fois que vous avez l'élément, faites simplement '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>

puis:

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

Notez que ce outerHTMLn'est pas compatible avec plusieurs navigateurs.


1
le problème avec l'obtention du fichier innerHTML pour le parent de la div est que j'obtiendrai également le fichier innerHTML pour les frères
Richard H

Mon mauvais, j'ai pensé que le "mettre un attribut id sur l'élément" fait référence à "l'élément". Avec votre dernière modification, il est beaucoup plus clair que vous voulez ajouter un supplément divà la soupe :)
Jørn Schou-Rode

@JP: si l'élément n'est pas dans le document... alors où est-il, vous souciez-vous de nous éclairer tous?
jldupont

@JP: bien sûr, vous pouvez créer des éléments où vous le souhaitez, mais ce n'est pas une raison pour un vote négatif ... vous ne vous ferez pas beaucoup d'amis ici avec ce genre d'attitude.
jldupont

À peu près sûr, externalHTML est compatible avec tous les navigateurs depuis longtemps, n'ayez pas peur de l'utiliser.
Neige

3

Si vous voulez une empreinte plus légère, mais un script plus, obtenir les éléments innerHTML et seulement créer et cloner le vide parent-

function getHTML(who,lines){
    if(!who || !who.tagName) return '';

    var txt, ax, str, el= document.createElement('div');
    el.appendChild(who.cloneNode(false));
    txt= el.innerHTML;
    ax= txt.indexOf('>')+1;
    str= txt.substring(0, ax)+who.innerHTML+ txt.substring(ax);

    el= null;
    return lines? str.replace(/> *</g,'>\n<'): str;
    //easier to read if elements are separated
}


2

comme externalHTML est IE uniquement, 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 élément vide bidon du type parent et utilise innerHTML dessus, puis rattache l'élément dans le dom normal


2

Vous voudrez quelque chose comme ça pour que ce soit un navigateur croisé.

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

    return container.innerHTML;
}

1
Cela supprimerait elementdu document une fois appelé, non?
Jørn Schou-Rode

Il aurait résolu cela maintenant en ajoutant cloneNode, ce qui le rend à peu près identique à certaines des autres réponses ici.
Nikolas Stephan

1

vieille question mais pour les nouveaux arrivants:

document.querySelector('div').outerHTML


0

définir la fonction externalHTML en fonction du support de element.outerHTML:

var temp_container = document.createElement("div"); // empty div not added to DOM
if (temp_container.outerHTML){
    var outerHTML = function(el){return el.outerHTML||el.nodeValue} // e.g. textnodes do not have outerHTML
  } else { // when .outerHTML is not supported
    var outerHTML = function(el){
      var clone = el.cloneNode(true);
      temp_container.appendChild(clone);
      outerhtml = temp_container.innerHTML;
      temp_container.removeChild(clone);
      return outerhtml;
    };
  };

-2
var el = document.getElementById('foo');
el.parentNode.innerHTML;

4
cela me donnera également un code HTML pour les frères et sœurs de la div, n'est-ce pas?
Richard H

Qu'est-ce qui se passe avec le vote négatif? La question initiale n'avait rien à voir avec les frères et sœurs. Cette réponse était une réponse parfaitement valable étant donné le contexte original de la question.
Jason Leveille

En revanche, la question initiale n'avait rien à voir avec un parent. Donc quel que soit.
Jason Leveille
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.