DOMノードの文字列表現を取得する


96

Javascript:ノード(要素またはドキュメント)のDOM表現があり、その文字列表現を探しています。例えば、

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

収まるはずです:

get_string(el) == "<p>Test</p>";

単純なものは見当たらないという強い気持ちがありますが、IE、FF、Safari、Operaで機能するメソッドが見つかりません。したがって、outerHTMLはオプションではありません。


4
おそらくバージョン11では、FirefoxはouterHTMLもサポートしています:bugzilla.mozilla.org/show_bug.cgi
id

1
今のところ、IE、FF、Safari、Chrome、OperaはすべてouterHTMLをサポートしています
。developer.mozilla.org/ en

1
はい、それは今(2009年以来)ささいなタスクになっています:)
Boldewyn 2015

ええ

回答:


133

一時的な親ノードを作成して、そのinnerHTMLコンテンツを取得できます。

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

var tmp = document.createElement("div");
tmp.appendChild(el);
console.log(tmp.innerHTML); // <p>Test</p>

編集: outerHTMLについては、以下の回答を参照してください。el.outerHTMLが必要なすべてのはずです。


1
痛い。とてもシンプルです...ほんの少しメモ:ドキュメント全体を「文字列化」したい場合は、document.documentElementで同じメソッドを使用できます(ユースケース:AJAXリクエスト)。おそらくあなたはそれを答えに組み込むことができますか?
Boldewyn、2009年

3
@Boldewyn:全体document.documentElementをdivに追加できますか?神聖ながらくた....
Roatin Marth

地獄のように単純... +1ひどすぎるdocumentFragmentはinnerHTMLをサポートしていません
Lajos Meszaros 2013

30
outerHTMLは答えである
neaumusic

3
elementに追加するtmpときは、それを追加する前に複製することを忘れないでください。tmpそれはから削除されdocumentます。
OlcayErtaş16年

44

あなたが探しているのは「outerHTML」ですが、古いブラウザと互換性のない代替cozが必要です。

var getString = (function() {
  var DIV = document.createElement("div");

  if ('outerHTML' in DIV)
    return function(node) {
      return node.outerHTML;
    };

  return function(node) {
    var div = DIV.cloneNode();
    div.appendChild(node.cloneNode(true));
    return div.innerHTML;
  };

})();

// getString(el) == "<p>Test</p>"

私のjQueryプラグインはここにあります:選択した要素の外部HTMLを取得します


outerHTML私が質問した後、Firefox がバージョン11で追加されました。当時はそれは選択肢ではありませんでした。よく見ると、適切なコメントで質問を更新しました。
Boldewyn 2013年

この権利、要素IDとその他のinnerHtml
属性を

1
@SergeyPanfilov:を呼び出す前にノードを空のdivでラップしたため、何もドロップしませんでしたinnerHTML。)
gtournie 2015年

3
2015年には、これは遠いところの最良の答えです。
ACK_stoverflow 2015

ええ、今日の時点では、非常に古い(IE> 10、Safari> 7、本当に古いFF、Chrome)および/またはあいまいなブラウザー(Opera Mini)のみがこのouterHTML属性をサポートしていません。caniuse.com/#feat=xml-serializer
GertSønderby

20

これには複雑なスクリプトは必要ないと思います。使うだけ

get_string=(el)=>el.outerHTML;

これが最良の答えです
Avraham

15

FFでは、XMLSerializerオブジェクトを使用してXMLを文字列にシリアル化できます。IEはxmlノードのプロパティを提供します。したがって、次のことができます。

function xml2string(node) {
   if (typeof(XMLSerializer) !== 'undefined') {
      var serializer = new XMLSerializer();
      return serializer.serializeToString(node);
   } else if (node.xml) {
      return node.xml;
   }
}

FYI .xmlは(現在のページのノードのように)DOMノードでは機能しません。XML DOMドキュメントノードでのみ機能します。
クレセントフレッシュ、

逆に、outerHTMLXML DOMドキュメントノードでは機能しません。(現在のページのノードと同様に)DOMノードでのみ機能します。私はそこに良い整合性があります。
クレセントフレッシュ、

7

Element#outerHTMLを使用:

var el = document.createElement("p");
el.appendChild(document.createTextNode("Test"));

console.log(el.outerHTML);

また、DOM要素の記述にも使用できます。Mozillaのドキュメントから:

要素のDOMインターフェースのouterHTML属性は、その子孫を含む要素を記述するシリアル化されたHTMLフラグメントを取得します。要素を指定された文字列から解析されたノードで置き換えるように設定できます。

https://developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML


3

element.outerHTMLを使用して、外部タグや属性を含む要素の完全な表現を取得します。


1

要素に親がある場合

element.parentElement.innerHTML

2
答えてくれてありがとう!残念ながらそれはすでに提案されていましたが、回答者は回答を削除しました。問題は、親に必要以上のマークアップが含まれている可能性があることです。<li>リスト内の単一のouterHTMLについて考えてください。
Boldewyn、2015年


1

私のユースケースでは、outerHTML全体が常に必要なわけではないことがわかりました。多くのノードには、表示するには子が多すぎます。

ここに関数があります(最低でもChromeでテストされています):

/**
 * Stringifies a DOM node.
 * @param {Object} el - A DOM node.
 * @param {Number} truncate - How much to truncate innerHTML of element.
 * @returns {String} - A stringified node with attributes
 *                     retained.
 */
function stringifyEl(el, truncate) {
    var truncateLen = truncate || 50;
    var outerHTML = el.outerHTML;
    var ret = outerHTML;
    ret = ret.substring(0, truncateLen);

    // If we've truncated, add an elipsis.
    if (outerHTML.length > truncateLen) {
      ret += "...";
    }
    return ret;
}

https://gist.github.com/kahunacohen/467f5cc259b5d4a85eb201518dcb15ec


0

受け入れられた回答のコードを使用してDOMElementsを反復処理するときに何が問題であるかを理解するのに多くの時間を費やしました。これは私にとってうまくいったものであり、そうでなければ、1つおきの要素がドキュメントから消えます:

_getGpxString: function(node) {
          clone = node.cloneNode(true);
          var tmp = document.createElement("div");
          tmp.appendChild(clone);
          return tmp.innerHTML;
        },

1
ここでは別の問題があると思いますが、私は手足を出しません。上記の解決策、DOMから元の要素を削除することに注意してください。したがって、のようなライブコレクションを使用するとdocument.getElementsByTagName()、そのコレクションはforループの途中で変更されるため、2番目の要素ごとにスキップされます。
Boldewyn、2014年

-1

反応を使用する場合:

const html = ReactDOM.findDOMNode(document.getElementsByTagName('html')[0]).outerHTML;

.outerHTMLReact固有ではありません。これはDOM標準です。@Rich Apodacaの回答を確認してください。
chharvey 2017

はい...私の回答の関心点(反応を使用する場合)はreactdom.findDOMNode()...ではなく、.outerHTMLですが、役職に感謝します。
victorkurauchi 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.