So erhalten Sie den HTML-Code für ein DOM-Element in Javascript

94

Stellen Sie sich vor, ich habe folgenden HTML-Code:

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

Ich möchte den HTML-Code für das Div erhalten, einschließlich des Div selbst. Element.innerHTML gibt nur Folgendes zurück:

<span>...</span>

Irgendwelche Ideen? Vielen Dank

Richard H.
quelle

Antworten:

87

Wenn Sie die Antwort von jldupont erweitern, können Sie im laufenden Betrieb ein Wrapping-Element erstellen:

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

Ich klone das Element, um zu vermeiden, dass das Element entfernt und erneut in das eigentliche Dokument eingefügt werden muss. Dies kann jedoch teuer sein, wenn das zu druckende Element einen sehr großen Baum darunter hat.

Jørn Schou-Rode
quelle
Alles in allem ist dies wahrscheinlich meine beste Option. Ein wenig vorsichtig beim Abnehmen / Anbringen von Elementen, kann ich das DOM nicht vermasseln, und ich erwarte nicht, dass es große Bäume gibt.
Richard H
Es sei denn, myElement ist ein Element, das kein untergeordnetes Element eines div sein kann, z. B. ein li, eine Tabellenzeile oder eine Tabellenzelle usw.
RobG
20
Jetzt, da es 2013 ist, funktioniert der Aufruf von "domnode.outerHTML" in allen gängigen Browsern (FF seit Version 11)
Kevin
87

Verwendung outerHTML:

var el = document.getElementById( 'foo' );
alert( el.outerHTML );
Majkel
quelle
2
Nein, es ist eine IE-Erweiterung. Obwohl es Firefox- Problemumgehungen
Wim
1
WebKit-basierte Browser scheinen dies zu unterstützen, Firefox jedoch nicht.
Jørn Schou-Rode
2
Laut quirksmode.org/dom/w3c_html.html sollte es in IE, Opera, Safari und Chrome funktionieren.
Majkel
18
Beachten Sie, dass OuterHTML Teil von HTML5 ist und daher von allen rechtzeitig unterstützt werden sollte.
Xanthir
7
outerHTMLwird seit FF11 unterstützt: developer.mozilla.org/en-US/docs/Web/API/element.outerHTML .
Felix Kling
8

Setzen Sie zuerst divein Element ein, das das betreffende idElement getElementByIdumschließt, fügen Sie dem Element ein Attribut hinzu und verwenden Sie es dann: Wenn Sie das Element haben, führen Sie einfach 'e.innerHTML' aus, um den HTML-Code abzurufen.

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

=> <div id="wrap"><div><span><b>This is in bold</b></span></div></div>

und dann:

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

Beachten Sie, dass dies outerHTMLnicht browserübergreifend kompatibel ist.

jldupont
quelle
1
Das Problem beim Abrufen des innerHTML für die Eltern des Divs ist, dass ich auch das innerHTML für die Geschwister des Divs bekomme
Richard H
Mein schlechtes, ich dachte, das "ein ID-Attribut auf das Element setzen" bezog sich auf "das Element". Mit Ihrer letzten Bearbeitung ist es viel klarer, dass Sie divder Suppe eine zusätzliche hinzufügen möchten :)
Jørn Schou-Rode
@JP: Wenn das Element nicht in der document... ist, wo ist es dann? Möchtest du uns alle aufklären?
Jldupont
@JP: Natürlich können Sie Elemente erstellen, wo Sie wollen, aber dies ist kein Grund für eine Ablehnung ... Sie werden hier nicht viele Freunde mit dieser Einstellung finden.
Jldupont
Ich bin mir ziemlich sicher, dass OuterHTML seit langer, langer Zeit browserübergreifend kompatibel ist - haben Sie keine Angst davor, es zu verwenden.
Schnee
3

Wenn Sie einen geringeren Platzbedarf, aber ein längeres Skript wünschen, holen Sie sich die Elemente innerHTML und erstellen und klonen Sie nur das leere übergeordnete Element.

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
}
kennebec
quelle
3
var x = $('#container').get(0).outerHTML;
Pawan Jasoria
quelle
2

Verwenden Sie diese Funktion, da OuterHTML nur IE ist:

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

Erstellt ein falsches leeres Element vom Typ "Parent" und verwendet innerHTML. Anschließend wird das Element wieder in den normalen Dom eingefügt

Zenon
quelle
2

Sie möchten, dass so etwas browserübergreifend ist.

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

    return container.innerHTML;
}
Nikolas Stephan
quelle
1
Dies würde elementbeim Aufruf aus dem Dokument entfernt werden, oder?
Jørn Schou-Rode
Es hätte das jetzt durch Hinzufügen von cloneNode behoben, was es ziemlich identisch mit einigen der anderen Antworten hier macht.
Nikolas Stephan
1

alte Frage, aber für Neuankömmlinge, die vorbeikommen:

document.querySelector('div').outerHTML

pery mimon
quelle
0

Definieren Sie die Funktion OuterHTML basierend auf der Unterstützung von 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;
    };
  };
Remi
quelle
-2
var el = document.getElementById('foo');
el.parentNode.innerHTML;
Jason Leveille
quelle
4
Dies wird mir auch HTML für die Geschwister des Div geben, obwohl?
Richard H
Was ist los mit der Abwahl? Die ursprüngliche Frage hatte nichts mit Geschwistern zu tun. Diese Antwort war angesichts des ursprünglichen Kontextes der Frage eine vollkommen gültige Antwort.
Jason Leveille
Andererseits hatte die ursprüngliche Frage nichts mit einem Elternteil zu tun. Was auch immer.
Jason Leveille