Come ottenere l'HTML per un elemento DOM in javascript


94

Immagina di avere il seguente codice HTML:

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

Voglio ottenere l'HTML per il div, incluso il div stesso. Element.innerHTML restituisce solo:

<span>...</span>

Qualche idea? Grazie

Risposte:


87

Espandendo la risposta di jldupont, potresti creare un elemento di avvolgimento al volo:

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

Sto clonando l'elemento per evitare di dover rimuovere e reinserire l'elemento nel documento effettivo. Ciò potrebbe essere costoso se l'elemento che desideri stampare ha un albero molto grande sotto di esso, però.


ciao - a conti fatti questa è probabilmente la mia migliore opzione. un po 'diffidente nel staccare / attaccare elementi, non posso rovinare il DOM e non mi aspetto che ci siano alberi di grandi dimensioni.
Richard H

A meno che myElement non sia un elemento che non può essere figlio di un div, come un li, una riga di una tabella o una cella di una tabella e così via.
RobG

20
Ora che è il 2013, la chiamata "domnode.outerHTML" funziona su tutti i principali browser (FF dalla v11)
Kevin

87

Usa outerHTML:

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

2
No, è un'estensione di IE. Sebbene esistano soluzioni alternative per Firefox: snipplr.com/view/5460/outerhtml-in-firefox
Wim

1
I browser basati su WebKit sembrano supportarlo, ma Firefox no.
Jørn Schou-Rode

2
Secondo quirksmode.org/dom/w3c_html.html dovrebbe funzionare in IE, Opera, Safari e Chrome.
Majkel

18
Nota che outerHTML fa parte di HTML5 e quindi dovrebbe essere supportato da tutti nel tempo.
Xanthir


8

Per prima cosa, metti l'elemento che avvolge l'elemento divin questione, metti un idattributo sull'elemento e poi getElementByIdusalo su di esso: una volta ottenuto il lement, fai semplicemente 'e.innerHTML` per recuperare l'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>

e poi:

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

Tieni presente che outerHTMLnon è compatibile con più browser.


1
il problema con il recupero dell'HTML interno per il genitore del div è che riceverò anche l'InnerHTML per i fratelli del div
Richard H

Colpa mia, pensavo che "metti un attributo id sull'elemento" si riferisse a "l'elemento". Con la tua ultima modifica è molto più chiaro che vuoi aggiungere un'ulteriore divalla zuppa :)
Jørn Schou-Rode

@JP: se l'elemento non è nel document... allora dov'è, ti interessa illuminarci tutti?
jldupont

@JP: ovviamente puoi creare elementi dove vuoi ma questo non è un motivo per un voto negativo ... non farai molti amici qui intorno con quel tipo di atteggiamento.
jldupont

Abbastanza sicuro che outerHTML è compatibile con tutti i browser da molto, molto tempo - non aver paura di usarlo.
Neve

3

Se si desidera un'impronta più leggera, ma uno script più, ottenere gli elementi innerHTML e solo creare e clonare il vuoto genitore

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

poiché outerHTML è solo IE, usa questa funzione:

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

crea un elemento vuoto fasullo del tipo genitore e utilizza innerHTML su di esso e quindi ricollega l'elemento al normale dom


2

Avrai bisogno di qualcosa di simile per essere cross browser.

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

    return container.innerHTML;
}

1
Questo rimuoverà elementdal documento quando viene chiamato, giusto?
Jørn Schou-Rode

Lo avrebbe risolto ora aggiungendo cloneNode, che lo rende praticamente identico ad alcune delle altre risposte qui.
Nikolas Stephan

1

vecchia domanda ma per i nuovi arrivati ​​che vengono in giro:

document.querySelector('div').outerHTML


0

definire la funzione outerHTML basata sul supporto per 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
questo mi darà anche un html per i fratelli del div, giusto?
Richard H

Che succede con il voto negativo? La domanda originale non aveva nulla a che fare con i fratelli. Questa risposta era una risposta perfettamente valida dato il contesto originale della domanda.
Jason Leveille,

D'altra parte, la domanda originale non aveva nulla a che fare con un genitore. Quindi, qualunque cosa.
Jason Leveille,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.