Bir DOM düğümünün dize temsilini alın


99

Javascript: Bir düğümün (öğe veya belge) DOM temsiline sahibim ve bunun dize gösterimini arıyorum. Örneğin,

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

vermeli:

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

Önemsiz bir şekilde basit bir şeyi kaçırdığıma dair güçlü bir his var ama IE, FF, Safari ve Opera'da çalışan bir yöntem bulamıyorum. Bu nedenle, dış HTML seçeneği yoktur.


4
Muhtemelen sürüm 11 ile Firefox, OuterHTML: bugzilla.mozilla.org/show_bug.cgi?id=92264
— Boldewyn

1
Şimdilik, görünüşe göre IE, FF, Safari, Chrome, Opera'nın tümü externalHTML'yi destekliyor, bkz. Developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML
— wangf

1
Evet, şimdi (2009'dan beri) önemsiz bir görev haline geldi :)
— Boldewyn

Evet, kesinlikle dışHTML
— neaumusic

Yanıtlar:


138

Geçici bir üst düğüm oluşturabilir ve bunun innerHTML içeriğini alabilirsiniz:

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>

DÜZENLEME: Lütfen externalHTML ile ilgili aşağıdaki yanıta bakın. el.outerHTML gerekli olan tek şey olmalıdır.


1
Ah. Çok basit ... Sadece küçük bir not: Tüm belgenin "dizgiselleştirilmiş" olmasını istiyorsam, aynı yöntemi document.documentElement ile de kullanabilirim (usecase: AJAX istekleri). Belki bunu cevaba dahil edebilirsiniz?
— Boldewyn

3
@Boldewyn: document.documentElementBir div'in tamamını ekleyebilir misin? Holy crap ....
— Roatin Mart

Basit, cehennem gibi ... +1 Çok kötü belgeBir
— kısım iç HTML'yi

30
cevap
— dışHTML'dir

3
Eklemeden elementönce klonlamayı unutmayın, tmpçünkü eklediğinizde tmpkaldırılacaktır document.
— Olcay Ertaş

46

Aradığınız şey 'externalHTML', ancak bir geri dönüşe ihtiyacımız var, eski tarayıcılarla uyumlu değil.

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 eklentimi burada bulacaksınız: Seçili öğenin dış HTML'sini alın


outerHTMLSoruyu sorduktan sonra Firefox 11'de eklendi . Yani o zamanlar bu bir seçenek değildi. Hatta yakından bakarsanız sorumu uygun bir yorumla güncelledim.
— Boldewyn

Bu doğru, eğer kullanırsanız öğe kimliklerini ve diğer öznitelikleri bırakabilirsinizinnerHtml
— Sergei Panfilov

1
@SergeyPanfilov: Aramadan önce düğümü boş bir div içine sardığım için hiçbir şey düşürmedim innerHTML; )
— gtournie

3
2015'te bunun çok uzaktaki en iyi cevap olduğunu söyleyebilirim.
— ACK_stoverflow

Evet, bugün itibariyle yalnızca çok eski (IE> 10, Safari> 7, gerçekten eski FF, Chrome) ve / veya belirsiz tarayıcılar (Opera Mini) bu outerHTMLözelliği desteklemiyor . Ayrıca bakınız caniuse.com/#feat=xml-serializer
— Gert Sønderby

20

Bunun için karmaşık bir senaryoya ihtiyacınız olduğunu sanmıyorum. Sadece kullan

get_string=(el)=>el.outerHTML;

bu en iyi cevap
— Avraham

15

FF altında, XMLSerializerXML'i bir dizeye serileştirmek için nesneyi kullanabilirsiniz . IE size bir xmldüğümün özelliğini verir . Böylece şunları yapabilirsiniz:

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

Bilginize .xml, DOM düğümlerinde çalışmıyor (mevcut sayfadaki düğümlerde olduğu gibi). Yalnızca XML DOM belge düğümlerinde çalışır.
— Crescent Fresh

Ve tersine, outerHTMLXML DOM belge düğümlerinde çalışmaz. Yalnızca DOM düğümlerinde çalışır (mevcut sayfadaki düğümlerde olduğu gibi). Orada iyi bir tutarlılık olduğunu söyleyebilirim.
— Crescent Fresh

7

Öğe # externalHTML'yi kullanın:

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

console.log(el.outerHTML);

DOM öğelerini yazmak için de kullanılabilir. Mozilla'nın belgelerinden:

DOM arabiriminin dış HTML özniteliği, alt öğeleri de dahil olmak üzere öğeyi açıklayan serileştirilmiş HTML parçasını alır. Elemanı, verilen dizeden ayrıştırılan düğümlerle değiştirecek şekilde ayarlanabilir.

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


3

Dış etiketler ve nitelikler dahil, öğenin tam temsilini elde etmek için element.outerHTML'yi kullanın.


1

Öğenizin ebeveyni varsa

element.parentElement.innerHTML

2
Cevap için teşekkürler! Ne yazık ki bu zaten önerilmişti, ancak cevaplayıcı cevabı sildi. Sorun şu ki, ebeveyn istenenden çok daha fazla işaret içerebilir . Listedeki bir single için externalHTML'yi düşünün <li>.
— Boldewyn

1

Deneyin

new XMLSerializer().serializeToString(element);

Öneri için teşekkürler, ama Bryan Kale'nin cevabında tam olarak bunu önerdi.
— Boldewyn

1

Kullanım durumlarım için her zaman tüm dış HTML'yi istemediğimi anladım. Birçok düğümün gösterilemeyecek kadar çok çocuğu var.

İşte bir işlev (Chrome'da minimum olarak test edilmiştir):

/**
 * 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

Kabul edilen yanıttaki kodla DOMElements aracılığıyla yinelediğimde neyin yanlış olduğunu anlamak için çok zaman harcadım. Benim için işe yarayan buydu, aksi takdirde her ikinci öğe belgeden kaybolur:

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

1
Burada farklı bir problemin olduğunu varsaydığım zaman, bir uzvun çıkmam. Yukarıdaki çözümün , orijinal öğeyi DOM'dan kaldırdığını unutmayın . Yani, gibi canlı bir koleksiyon kullandığınızda document.getElementsByTagName(), bu koleksiyon fordöngü ortasında değişecek, dolayısıyla her ikinci öğe atlanacaktır.
— Boldewyn

-1

react kullanıyorsanız:

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

.outerHTMLReact'e özgü değildir; bu bir DOM standardıdır. @Rich Apodaca'nın cevabına göz atın.
— chharvey

evet ... cevabımdaki ilgi çekici nokta (eğer react kullanıyorsanız) reactdom.findDOMNode()... değildi .outerHTML, ama pozisyon için teşekkürler.
— victorkurauchi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.