Как получить HTML для элемента DOM в javascript

96

Представьте, что у меня есть следующий 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 не является элементом, который не может быть дочерним элементом div, например li, строкой таблицы или ячейкой таблицы и т. Д.
RobG
20
Теперь, когда наступил 2013 год, вызов «domnode.outerHTML» работает во всех основных браузерах (FF с версии 11)
Кевин
91

Использование outerHTML:

var el = document.getElementById( 'foo' );
alert( el.outerHTML );
Majkel
источник
2
Нет, это расширение IE. Хотя существуют обходные пути Firefox: snipplr.com/view/5460/outerhtml-in-firefox
Wim
1
Браузеры на основе WebKit, похоже, поддерживают его, а Firefox - нет.
Йорн Скоу-Роде
2
Согласно quirksmode.org/dom/w3c_html.html он должен работать в IE, Opera, Safari и Chrome.
Majkel
18
Обратите внимание, что externalHTML является частью HTML5 и поэтому должен быть поддержан всеми вовремя.
Xanthir
7
outerHTMLподдерживается начиная с FF11: developer.mozilla.org/en-US/docs/Web/API/element.outerHTML .
Феликс Клинг
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не поддерживает кроссбраузерность.

jldupont
источник
1
проблема с получением innerHTML для родителя div заключается в том, что я также получу innerHTML для братьев и сестер div
Ричард Х
Плохо, я думал, что «поставить атрибут id на элемент» относится к «элементу». С вашим последним редактированием стало намного яснее, что вы хотите добавить что-то еще divв суп :)
Йорн Скоу-Роде
@JP: если элемента нет в document... то где он, ты хочешь просветить всех нас?
jldupont
@JP: конечно, вы можете создавать элементы там, где хотите, но это не повод для отрицательного голосования ... у вас не будет много друзей здесь с таким отношением.
jldupont
Уверен, что externalHTML уже давно является кроссбраузерным - не бойтесь его использовать.
Snow
3

Если вам нужен более легкий след, но более длинный скрипт, получите элементы innerHTML и создайте и клонируйте только пустой родительский элемент.

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
источник
3
var x = $('#container').get(0).outerHTML;
Паван Ясория
источник
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, а затем повторно присоединяет элемент обратно к обычному dom

Зенон
источник
2

Вам понадобится что-то подобное, чтобы он был кроссбраузерным.

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

    return container.innerHTML;
}
Николас Стефан
источник
1
Это будет удалено elementиз документа при вызове, верно?
Йорн Скоу-Роде
Он бы исправил это сейчас, добавив cloneNode, что делает его в значительной степени идентичным некоторым другим ответам здесь.
Николас Стефан
1

старый вопрос, но для новичков, которые приходят:

document.querySelector('div').outerHTML

Pery Mimon
источник
0

определить функцию outerHTML на основе поддержки 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 для братьев и сестер div, правда?
Richard H
Что случилось с голосованием против? Первоначальный вопрос не имел ничего общего с братьями и сестрами. Этот ответ был совершенно правильным, учитывая исходный контекст вопроса.
Джейсон Левейл
С другой стороны, исходный вопрос не имел ничего общего с родителями. Итак, что угодно.
Джейсон Левейл