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.