자바 스크립트에서 DOM 요소에 대한 HTML을 얻는 방법


94

다음 HTML이 있다고 상상해보십시오.

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

div 자체를 포함하여 div에 대한 HTML을 얻고 싶습니다. Element.innerHTML은 다음 만 반환합니다.

<span>...</span>

어떤 아이디어? 감사

답변:


87

jldupont의 답변을 확장하면 즉시 래핑 요소를 만들 수 있습니다.

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

실제 문서에서 요소를 제거하고 다시 삽입 할 필요가 없도록 요소를 복제하고 있습니다. 그러나 인쇄하려는 요소의 아래에 매우 큰 트리가있는 경우 비용이 많이들 수 있습니다.


안녕-균형에 이것은 아마 나의 최선의 선택 일 것이다. 요소를 분리 / 부착하는 데 약간의주의를 기울이고 DOM을 망칠 수 없으며 큰 나무가있을 것으로 기대하지 않습니다.
Richard H

하지 않는 한 myElement은 너무에 리, 테이블 행 또는 테이블 셀과 같은 사업부의 자식이 될 수없는 요소이다.
RobG

20
이제 2013 년이되었으므로 "domnode.outerHTML"호출은 모든 주요 브라우저에서 작동합니다 (v11 이후 FF)
Kevin

87

사용 outerHTML:

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

2
아니요, IE 확장입니다. Firefox 해결 방법이 있지만 : snipplr.com/view/5460/outerhtml-in-firefox
Wim

1
WebKit 기반 브라우저는이를 지원하는 것 같지만 Firefox는 지원하지 않습니다.
Jørn Schou-Rode

2
quirksmode.org/dom/w3c_html.html 에 따르면 IE, Opera, Safari 및 Chrome에서 작동합니다.
Majkel

18
outerHTML은 HTML5의 일부이므로 시간 내에 모든 사람이 지원해야합니다.
Xanthir


8

먼저 div문제 의을 감싸는 요소를 놓고 요소 에 id속성을 넣은 다음 그 요소에 사용 getElementById합니다. 일단 당신이 HTML을 검색하기 위해 'e.innerHTML'을하세요.

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

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

그리고:

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

참고outerHTML 크로스 브라우저 호환되지 않습니다.


1
div의 부모에 대한 innerHTML을 얻는 문제는 div의 형제에 대한 innerHTML도 얻을 수 있다는 것입니다
Richard H

내 잘못은 "요소"를 참조하는 "요소에 ID 속성을 넣어"라고 생각했습니다. 마지막 편집 div을 통해 수프 에 추가하고 싶은 것이 훨씬 더 분명해 졌습니다. :)
Jørn Schou-Rode

@JP : 요소가 document...에 없으면 어디에 있습니까? 우리 모두를 계몽 해주시겠습니까?
jldupont

@JP : 물론 원하는 곳에 요소를 만들 수 있지만 이것은 투표 이유 가 없습니다 . 그런 태도로 여기에서 많은 친구를 사귀지 못할 것입니다.
jldupont

outerHTML은 오랫동안 브라우저 간 호환이 가능하다는 것을 확신합니다. 사용하는 것을 두려워하지 마십시오.
Snow

3

더 가벼운 풋 프린트를 원하지만 더 긴 스크립트를 원한다면 innerHTML 요소를 가져 와서 부모 만 만들고 복제하십시오.

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은 IE 전용이므로 다음 함수를 사용하십시오.

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

부모 유형의 가짜 빈 요소를 만들고 그것에 innerHTML을 사용한 다음 요소를 다시 일반 dom에 다시 연결합니다.


2

크로스 브라우저가 되려면 이와 같은 것을 원할 것입니다.

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

    return container.innerHTML;
}

1
element호출되면 문서에서 제거 됩니다.
Jørn Schou-Rode

이제 cloneNode를 추가하여 수정했을 것입니다. 이는 여기의 다른 답변 중 일부와 거의 동일합니다.
Nikolas Stephan

1

오래된 질문이지만 새로운 이민자를 위해 :

document.querySelector('div').outerHTML


0

element.outerHTML 지원에 따라 outerHTML 함수를 정의합니다.

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
이것은 또한 div의 형제 자매에 대한 HTML을 제공합니다.
Richard H

반대표는 어떻습니까? 원래 질문은 형제 자매와 관련이 없습니다. 이 답변은 질문의 원래 맥락을 고려할 때 완벽하게 유효한 답변이었습니다.
Jason Leveille

다른 한편으로, 원래의 질문은 부모와 관련이 없습니다. 그래서 뭐든.
Jason Leveille
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.