JavaScriptでDOM要素のHTMLを取得する方法


94

次のHTMLがあるとします。

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

div自体を含む、divのHTMLを取得したいと考えています。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を台無しにすることはできません。また、大きなツリーがあるとは思いません。
リチャードH

myElementがli、テーブル行、テーブルセルなど、divの子にできない要素でない限り。
RobG

20
2013年になりましたが、「domnode.outerHTML」の呼び出しはすべての主要なブラウザー(v11以降FF)で機能します
Kevin

87

使用outerHTML

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

2
いいえ、IE拡張機能です。Firefoxの回避策はありますが:snipplr.com/view/5460/outerhtml-in-firefox
Wim

1
WebKitベースのブラウザーはそれをサポートしているようですが、Firefoxはサポートしていません。
ジョーンSchouの-Rodeの

2
quirksmode.org/dom/w3c_html.htmlによると、IE、Opera、Safari、Chromeで動作するはずです。
マイケル

18
なお、outerHTMLはHTML5の一部であるため、すべての人がサポートする必要があります。
Xanthir 2009年

7
outerHTMLFF11以降でサポートされています:developer.mozilla.org/en-US/docs/Web/API/element.outerHTML
Felix Kling 2013

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
divの親のinnerHTMLを取得する際の問題は、divの兄弟のinnerHTMLも取得することです
Richard H

悪いことに、「要素にid属性を付ける」とは「要素」を指すと思っていました。あなたの最後の編集で、あなたが追加を追加することをたくさん明確ですdiv:)スープに
ジョーンSchouの-Rodeの

@JP:要素がdocument...にない場合、それはどこにありますか?
jldupont 2009年

@JP:もちろん、あなたが欲しいけど、これはされていない要素を作成することができます何のダウン投票の理由を...あなたは態度のその種の周りここに多くの友人を作ることはありません。
jldupont 2009年

outerHTMLが長い間、クロスブラウザ互換であると確信しています-使用することを恐れないでください。
雪の

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
}


2

outerHTMLは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、呼び出されたときにドキュメントから削除されますよね?
ジョーンSchouの-Rodeの

これは、cloneNodeを追加することで修正されました。これにより、ここでの他のいくつかの回答とほぼ同じになります。
ニコラスステファン


0

element.outerHTMLのサポートに基づいて関数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
これにより、divの兄弟のHTMLも表示されます。
リチャードH

反対票はどうなっていますか?元の質問は兄弟とは何の関係もありませんでした。この回答は、質問の元のコンテキストを考えると、完全に有効な回答でした。
Jason Leveille 2009年

一方、元の質問は親とは関係がありませんでした。なんにしても。
Jason Leveille、2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.