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.