JavaScript'te bir DOM öğesi için HTML nasıl alınır?


97

Aşağıdaki HTML'ye sahip olduğumu düşünün:

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

Div'in kendisi de dahil olmak üzere div için HTML'yi almak istiyorum. Element.innerHTML yalnızca şunu döndürür:

<span>...</span>

Herhangi bir fikir? Teşekkürler

Yanıtlar:


88

Jldupont'un cevabını genişleterek, anında bir sarma öğesi oluşturabilirsiniz:

var target = document.getElementById('myElement');
var wrap = document.createElement('div');
wrap.appendChild(target.cloneNode(true));
alert(wrap.innerHTML);

Öğeyi asıl belgede kaldırıp yeniden takmak zorunda kalmamak için öğeyi klonluyorum. Yine de, yazdırmak istediğiniz öğenin altında çok büyük bir ağaç varsa, bu pahalı olabilir.


merhaba - dengede bu muhtemelen benim en iyi seçeneğim. Elemanların sökülmesi / takılması konusunda biraz temkinli davranıyorum, DOM'u bozamıyorum ve orada büyük ağaçların olmasını beklemiyorum.
— Richard H

MyElement li, tablo satırı veya tablo hücresi vb. Gibi bir div öğesinin alt öğesi olamayacak bir öğe olmadığı sürece .
— RobG

20
Artık 2013, "domnode.outerHTML" çağrısı tüm büyük tarayıcılarda çalışıyor (v11'den beri FF)
— Kevin

93

Kullanım outerHTML:

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

2
Hayır, bu bir IE uzantısı. Firefox geçici çözümleri olmasına rağmen: snippetplr.com/view/5460/outerhtml-in-firefox
— Wim

1
WebKit tabanlı tarayıcılar bunu destekliyor gibi görünüyor, ancak Firefox desteklemiyor.
— Jørn Schou-Rode

2
Göre Quirksmode.org/dom/w3c_html.html'ye IE, Opera, Safari ve Chrome'da çalışmalıdır.
— Majkel

18
OuterHTML'nin HTML5'in bir parçası olduğunu ve bu nedenle herkes tarafından zamanında desteklenmesi gerektiğini unutmayın.
— Xanthir

7
outerHTMLFF11'den beri desteklenmektedir: developer.mozilla.org/en-US/docs/Web/API/element.outerHTML .
— Felix Kling

8

İlk olarak, söz konusu öğeyi saran öğeyi yerleştirin, öğeye divbir idöznitelik getElementByIdekleyin ve sonra onu kullanın : lement'i aldıktan sonra, HTML'yi almak için "e.innerHTML" yapın.

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

=> <div id="wrap"><div><span><b>This is in bold</b></span></div></div>

ve sonra:

var e=document.getElementById("wrap");
var content=e.innerHTML;

NotouterHTML çapraz tarayıcı uyumlu değildir.


1
div'in ebeveyni için innerHTML'yi elde etmedeki sorun, div'in kardeşleri için de innerHTML'yi alacağım
— Richard H

Benim hatam, "öğeye bir id niteliği koy" ifadesinin "öğeye" atıfta bulunduğunu düşündüm. Son düzenlemenizle divçorbaya bir tane daha eklemek isteyeceğiniz çok daha net :)
— Jørn Schou-Rode

@JP: Eğer öğe document... değilse nerede o zaman, hepimizi aydınlatmak ister misiniz?
— jldupont

@JP: Tabii istediğiniz unsurları oluşturabilir ancak bu değildir hiçbir bir aşağı-oylama nedeni ... sen tutum bu tür ile buralarda pek arkadaş yapmaz.
— jldupont

Dış HTML'nin uzun süredir tarayıcılar arası uyumlu olduğundan oldukça emin - kullanmaktan korkmayın.
— Kar

3

Daha hafif, ancak daha uzun bir komut dosyası istiyorsanız, innerHTML öğelerini alın ve yalnızca boş ebeveyni oluşturun ve klonlayın.

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 yalnızca IE olduğundan, şu işlevi kullanın:

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;
}

ebeveyn türünde sahte bir boş öğe oluşturur ve üzerinde innerHTML kullanır ve ardından öğeyi normal doma yeniden bağlar


2

Çapraz tarayıcı olması için bunun gibi bir şey isteyeceksiniz.

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

    return container.innerHTML;
}

1
Bu, elementarandığında belgeden çıkarılır, değil mi?
— Jørn Schou-Rode

Bunu şimdi cloneNode ekleyerek düzeltirdi, bu da onu buradaki diğer cevapların bazılarıyla hemen hemen aynı kılar.
— Nikolas Stephan

1

eski soru ama yeni gelenler için:

document.querySelector('div').outerHTML


0

element.outerHTML desteğine dayalı olarak function externalHTML'yi tanımlayın:

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
bu aynı zamanda bana div'in kardeşleri için herhangi bir html verecek değil mi?
— Richard H

Olumsuz oy ne durumda? Asıl sorunun kardeşlerle hiçbir ilgisi yoktu. Bu cevap, sorunun orijinal bağlamı göz önüne alındığında tamamen geçerli bir cevaptı.
— Jason Leveille

Öte yandan, asıl sorunun ebeveynle hiçbir ilgisi yoktu. Her neyse.
— Jason Leveille
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.