Як отримати HTML для елемента DOM в JavaScript


94

Уявіть, у мене є такий HTML:

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

Я хочу отримати HTML для div, включаючи сам div. Element.innerHTML повертає лише:

<span>...</span>

Якісь ідеї? Дякую

Відповіді:


87

Розширюючи відповідь jldupont, ви можете створити обгортковий елемент на льоту:

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

Я клоную елемент, щоб уникнути необхідності видаляти та вставляти елемент у фактичний документ. Це може бути дорогим, якщо елемент, який ви хочете надрукувати, має дуже велике дерево під ним.


привіт - на балансі - це, мабуть, найкращий варіант. трохи обережно від'єднуючи / прикріплюючи елементи, я не можу зіпсувати DOM, і я не сподіваюся, що там будуть великі дерева.
Річард Н

Якщо myElement не є елементом, який не може бути дитиною діва , як-от li, рядок таблиці або комірка таблиці тощо.
RobG

20
Тепер, коли настає 2013 рік, виклик "domnode.outerHTML" працює на всіх основних браузерах (FF з v11)
Кевін

87

Використання outerHTML:

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

2
Ні, це розширення IE. Хоча існують способи обходу Firefox: snipplr.com/view/5460/outerhtml-in-firefox
Вім

1
Здається, браузери на базі WebKit підтримують це, але Firefox не підтримує.
Йорн Шу-Роде

2
Відповідно до quirksmode.org/dom/w3c_html.html він повинен працювати в IE, Opera, Safari та Chrome.
Майкель

18
Зверніть увагу, що externalHTML є частиною HTML5, тому його слід підтримувати всім вчасно.
Ксантір


8

Спочатку надіньте елемент, який обговорює divпитання, поставте idатрибут на елемент, а потім використовуйте getElementByIdйого: як тільки ви отримаєте лемент, просто зробіть 'e.innerHTML', щоб отримати 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>

і потім:

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

Зверніть увагу, що outerHTMLне сумісний з переглядачами.


1
Проблема з отриманням innerHTML для батька діва полягає в тому, що я також отримаю внутрішнійHTML для братів і сестер дівичів
Річард Н

Погано, я думав, що "встановити атрибут id на елемент" посилається на "елемент". З останньою редакцією набагато зрозуміліше, що ви хочете додати divв суп додатково :)
Jørn Schou-Rode

@JP: якщо елемент не в document... тоді де він, ти хочеш просвітити нас усіх?
jldupont

@JP: звичайно, ти можеш створювати елементи, де хочеш, але це не привід для голосування вниз ... ти не будеш багато дружити тут з таким ставленням.
jldupont

Впевнений, що externalHTML вже давно, довго сумісний з переглядачами - не бійтеся його використовувати.
Сніг

3

Якщо ви хочете легший слід, але довший сценарій, введіть елементиHTML та створіть та клонуйте лише порожні батьківські

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

оскільки externalHTML є лише IE, використовуйте цю функцію:

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

створює помилковий порожній елемент батьківського типу і використовує на ньому innerHTML, а потім повторно приєднує елемент назад до звичайного дому


2

Вам потрібно щось подібне, щоб воно було перехресним браузером.

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

    return container.innerHTML;
}

1
Це призведе до видалення elementз документа при виклику, так?
Jørn Schou-Rode

Це могло б виправити це зараз, додавши cloneNode, що робить його майже ідентичним деяких інших відповідей тут.
Ніколяс Стефан


0

визначте функцію externalHTML на основі підтримки для 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
це також дасть мені будь-який html для братів і сестер, але правда?
Річард Н

Що сталося з голосом "за"? Початкове запитання не мало нічого спільного з братами та сестрами. Ця відповідь була цілком коректною відповіддю з огляду на вихідний контекст питання.
Джейсон Левей

З іншого боку, оригінальне запитання не мало нічого спільного з батьком. Отже, що завгодно.
Джейсон Левель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.