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

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.


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

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


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.


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
}


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


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

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


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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.